java字符串的替換replace、replaceAll、replaceFirst的區(qū)別說明
字符串的替換replace、replaceAll、replaceFirst區(qū)別
如果不是剛剛復習了下正則表達式,我可能也不會注意到,原來String的replaceAll跟replaceFirst用到了正則表達式!
不多解釋,看代碼
String s = "my.test.txt"; System.out.println(s.replace(".", "#")); System.out.println(s.replaceAll(".", "#")); System.out.println(s.replaceFirst(".", "#"));
運行結(jié)果:
my#test#txt
###########
#y.test.txt
是不是感覺很神奇?
其實懂正則表達式的應該已經(jīng)發(fā)現(xiàn)了,是的,“.”是正則表達式的元字符,匹配除換行符以外的任意字符,所以replaceAll、replaceFirst才出現(xiàn)了這樣的結(jié)果。
而replace沒有用到正則表達式,但會把所有“.”替換掉,很多人可能會誤解replace是替換單個,而replaceAll是替換全部,其實這是錯的(我以前也是這么想的- -)。replace只是沒有用到正則表達式,但會替換所有匹配的字符串。
到這里一些不懂正則表達式的小伙伴可能就要喊坑爹了,“那我不想用正則表達式去替換第一個字符串腫么辦?”其實也很簡單,只要將元字符串轉(zhuǎn)義就行了。
s.replaceFirst("\\.", "#")
運行結(jié)果:
my#test.txt
這里給個會被正則表達式識別的字符列表:
- .匹配除換行符以外的任意字符
- ^匹配字符串的開始
- $匹配字符串的結(jié)束
- *重復零次或更多次
- +重復一次或更多次
- ?重復零次或一次
當然,正則可遠不止這么點,個人建議花點時間去學習一下比較好~
補充:String的split也是用到了正則表達式,使用的時候注意點哦!
replaceAll、replaceFirst使用需要注意的問題
昨天系統(tǒng)報錯,No group 6,上網(wǎng)查詢,說是replaceAll()的問題,就具體試驗了一下,發(fā)現(xiàn)如果不注意,就會產(chǎn)生隱含的錯誤。
java的String類的replaceAll方法是一個挺常用的方法,
類型定義如下
String replaceAll(String regex, String replacement)
有兩個參數(shù),第一個是被替換的字符串,是正則表達式,另外一個是替換成的字符串。
如果我們這樣寫
upLoadedFileName.replaceAll("","/"); ? ? ? ? ? // 把//替換為/
是沒有什么問題的,而且用好正則表達式可以實現(xiàn)很強的功能,如:
str.replaceAll("(?i)"+oldStr,newStr);//忽略大小寫;
但是,使用中我們一定要記住,不僅僅第一個參數(shù)是正則表達式,第二個也是,因此如果這兩個是可變參數(shù),就要注意參數(shù)的內(nèi)容,一篇文檔說應該在所有的[ / ^ $ . | ? * + ( ) { }符號前面加上/符號。經(jīng)過我的測試(jdk1.4),只有/和$容易出錯。
比如:
System.out.println("/".replaceFirst("/", "http://"));
系統(tǒng)會報:
java.lang.StringIndexOutOfBoundsException: String index out of range: 1
System.out.println("/".replaceFirst("/", "x//"));
系統(tǒng)會報:
java.lang.StringIndexOutOfBoundsException: String index out of range: 2
System.out.println("/".replaceFirst("/", "http://X"));
執(zhí)行結(jié)果是X
System.out.println("/".replaceFirst("/", "$6"));
執(zhí)行結(jié)果拋出例外:
java.lang.IndexOutOfBoundsException: No group 6
所以如果參數(shù)是變量,而且可能包含/或$,建議不要使用replaceAll和replaceFirst方法。
我實現(xiàn)了這兩個方法,大家可以直接引用
? ?/** ? ? * 字符串替換,從頭到尾查詢一次,替換后的字符串不檢查 ? ? * @param str ? ? 源字符串 ? ? * @param oldStr ?目標字符串 ? ? * @param newStr ?替換字符串 ? ? * @return ? ? ? ?替換后的字符串 ? ? */ ? ?static public String replaceAll(String str, String oldStr, String newStr) ? ?{ ? ? ?int i = str.indexOf(oldStr); ? ? ?int n = 0; ? ? ?while(i != -1) ? ? ?{ ? ? ? ?str = str.substring(0, i) + newStr + str.substring(i + oldStr.length()); ? ? ? ?i = str.indexOf(oldStr, i + newStr.length()); ? ? ? ?n++; ? ? ?} ? ? ?return str; ? ?}?? ? ?/** ? ? * 字符串替換,左邊第一個。 ? ? * @param str ? ? 源字符串 ? ? * @param oldStr ?目標字符串 ? ? * @param newStr ?替換字符串 ? ? * @return ? ? ? ?替換后的字符串 ? ? */ ? ?static public String replaceFirst(String str, String oldStr, String newStr) ? ?{ ? ? ?int i = str.indexOf(oldStr); ? ? ?if (i == -1) return str; ? ? ?str = str.substring(0, i) + newStr + str.substring(i + oldStr.length()); ? ? ?return str; ? ?} ? ?System.out.println(StringTools.replaceAll("/","/","http://"));
結(jié)果是/
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java操作SSH2實現(xiàn)遠程執(zhí)行l(wèi)inux命令
這篇文章主要為大家詳細介紹了Java如何操作SSH2實現(xiàn)遠程執(zhí)行l(wèi)inux命令,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-01-01java配置變量的解釋,搬運他人優(yōu)質(zhì)評論(推薦)
這篇文章主要介紹了java配置變量,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04Java volatile四種內(nèi)存屏障的作用與生效機制原理詳解
內(nèi)存屏障是處理器提供的一種指令,用于控制指令執(zhí)行順序和內(nèi)存可見性,在Java中,volatile關(guān)鍵字就是通過插入內(nèi)存屏障來實現(xiàn)其內(nèi)存語義的,下面我將詳細解釋四種內(nèi)存屏障的含義和工作原理,感興趣的朋友一起看看吧2025-09-09Kotlin-Coroutines中的async與await異步協(xié)程管理
這篇文章主要為大家介紹了Kotlin-Coroutines中的async與await異步協(xié)程管理,提升程序性能解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10Spring?Boot整合持久層之JPA多數(shù)據(jù)源
JPA(Java Persistence API)Java 持久化 API,是 Java 持久化的標準規(guī)范,Hibernate 是持久化規(guī)范的技術(shù)實現(xiàn),而 Spring Data JPA 是在 Hibernate 基礎(chǔ)上封裝的一款框架2022-08-08Java中finally和return的關(guān)系實例解析
這篇文章主要介紹了Java中finally和return的關(guān)系實例解析,總結(jié)了二者的關(guān)系,然后分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02