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

