Java中replace、replaceAll和replaceFirst函數(shù)的用法小結(jié)
首先概述一下他們?nèi)齻€(gè)的用法:
· replace(CharSequence target, CharSequence replacement) ,用replacement替換所有的target,兩個(gè)參數(shù)都是字符串。
· replaceAll(String regex, String replacement) ,用replacement替換所有的regex匹配項(xiàng),regex很明顯是個(gè)正則表達(dá)式,replacement是字符串。
· replaceFirst(String regex, String replacement) ,基本和replaceAll相同,區(qū)別是只替換第一個(gè)匹配項(xiàng)。
接下來(lái)有個(gè)簡(jiǎn)單的需求,就是把源字符串中的a替換成\a,代碼如下:
System.out.println("abac".replace("a", "\\a")); //\ab\ac System.out.println("abac".replaceAll("a", "\\a")); //abac System.out.println("abac".replaceFirst("a", "\\a")); //abac
結(jié)果讓人大吃一驚,用了這么多年的替換,竟然有點(diǎn)蒙了。
源字符串是"abac",然后我們找到"a",把它替換成\a,由于\是java轉(zhuǎn)義字符,所以想表達(dá)\a必須寫成"\\a",第一個(gè)反斜線將第二個(gè)反斜線轉(zhuǎn)義成普通字符串。
三個(gè)替換表達(dá)式,只有第一個(gè)replace函數(shù)的結(jié)果是正確的,問(wèn)題出在哪呢?
replaceAll和replaceFirst要求第一個(gè)參數(shù)是正則表達(dá)式,"a"既能理解成字符串a(chǎn),也可以理解成正則表達(dá)式a,所以第一個(gè)參數(shù)沒(méi)問(wèn)題。
問(wèn)題就出在第二個(gè)參數(shù)上,如果讀者仔細(xì)閱讀replaceAll函數(shù)的注釋,會(huì)發(fā)現(xiàn)有如下說(shuō)明:
Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll. Use java.util.regex.Matcher.quoteReplacement to suppress the special meaning of these characters, if desired.
由于replaceAll和replaceFirst的第一個(gè)參數(shù)是正則,所以我們可以在第二個(gè)參數(shù)中做些小花樣,比如有這樣一個(gè)需求:把源字符串中的a替換成a后邊緊鄰的字符,代碼如下:
System.out.println("abac".replaceAll("a(\\w)", "$1$1")); //bbcc System.out.println("abac".replaceFirst("a(\\w)", "$1$1")); //bbac
正則的含義假設(shè)讀者可以讀懂,可以看出,在第二個(gè)參數(shù)中,可以用$符號(hào)獲取分組的內(nèi)容,本例中用$1取到了第一個(gè)分組的內(nèi)容,即a后邊緊鄰的字符。
因此,$符號(hào)在第二個(gè)參數(shù)中是有特殊含義的,亂寫會(huì)報(bào)錯(cuò):
System.out.println("abac".replaceAll("a(\\w)", "$")); //Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
那假如我就想替換成$呢?這就需要轉(zhuǎn)義字符:
System.out.println("abac".replaceAll("a", "\\$")); //$b$c
到這,讀者可能會(huì)恍然大悟,原來(lái)反斜線在第二個(gè)參數(shù)中也有特殊含義(轉(zhuǎn)義),所以如果我們想表達(dá)反斜線,就必須再轉(zhuǎn)義一次:
System.out.println("abac".replaceAll("a", "\\\\a")); //\ab\ac System.out.println("abac".replaceFirst("a", "\\\\a")); //\abac
簡(jiǎn)單理解一下,"\\\\a"中前邊的反斜線分別轉(zhuǎn)義后邊的反斜線,讓后邊的反斜線就是普通字符串,這樣在java內(nèi)存中看到的字符串就是"\\a",然后replaceAll函數(shù)在處理時(shí),再用前邊的反斜線轉(zhuǎn)義后邊的反斜線,來(lái)表達(dá)后邊的反斜線就是普通字符串,不是用來(lái)轉(zhuǎn)義$的,最終內(nèi)存中的字符串就是"\a",這樣才可以成功將a替換成\a。
總結(jié)
轉(zhuǎn)義的問(wèn)題確實(shí)糾結(jié),通過(guò)本文,筆者希望讀者以后使用這些函數(shù)時(shí),能夠保持清醒,能夠意識(shí)到參數(shù)中的特殊字符,避免寫出定時(shí)炸彈。以上就是這篇文章的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)和工作能有所幫助,如果有疑問(wèn)可以留言交流。
- javascript中使用replaceAll()函數(shù)實(shí)現(xiàn)字符替換的方法
- Javascript中正則表達(dá)式的全局匹配模式分析
- Javascript中使用exec進(jìn)行正則表達(dá)式全局匹配時(shí)的注意事項(xiàng)
- JavaScript實(shí)現(xiàn)的字符串replaceAll函數(shù)代碼分享
- javascript實(shí)現(xiàn)全局匹配并替換的方法
- java中replaceAll替換圓括號(hào)實(shí)例代碼
- Java中replace與replaceAll的區(qū)別與測(cè)試
- java字符串的替換replace、replaceAll、replaceFirst的區(qū)別說(shuō)明
- Java replaceAll()方法報(bào)錯(cuò)Illegal group reference的解決辦法
- String.replaceAll方法詳析(正則妙用)
- 淺談Java中replace與replaceAll區(qū)別
- 淺談java中replace()和replaceAll()的區(qū)別
- jQuery中replaceAll()方法用法實(shí)例
- js使用正則實(shí)現(xiàn)ReplaceAll全部替換的方法
- js字符串替換所有的指定字符或文字(推薦replaceAll方法)
- JS中實(shí)現(xiàn)replaceAll的方法(實(shí)例代碼)
- js replace 與replaceall實(shí)例用法詳解
- Flex 字符串ReplaceAll使用說(shuō)明
- JavaScript中使用replace結(jié)合正則實(shí)現(xiàn)replaceAll的效果
相關(guān)文章
Java語(yǔ)言中flush()函數(shù)作用及使用方法詳解
這篇文章主要介紹了Java語(yǔ)言中flush函數(shù)作用及使用方法詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01如何用Dos命令運(yùn)行Java版HelloWorld你知道嗎
這篇文章主要介紹了在dos窗口中編譯和運(yùn)行java文件的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Java數(shù)組常用排序算法實(shí)例小結(jié)
這篇文章主要介紹了Java數(shù)組常用排序算法,結(jié)合實(shí)例形式總結(jié)分析了java數(shù)組常用的4種排序算法,包括冒泡排序、數(shù)組遞增排序、快速排序及選擇排序,需要的朋友可以參考下2017-12-12Java中BufferedReader類獲取輸入輸入字符串實(shí)例
這篇文章主要介紹了Java中BufferedReader類獲取輸入輸入字符串實(shí)例,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02java發(fā)送http的get、post請(qǐng)求實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇java發(fā)送http的get、post請(qǐng)求實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05Java異常的幾個(gè)謎題_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文給大家收藏整理java異常的幾個(gè)謎題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-06-06透過(guò)Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則圖文詳解
Java Bean是一種 Java 編程語(yǔ)言編寫的可重用軟件組件,包括符合一定規(guī)范的Java 類、屬性和方法,用于描述和處理應(yīng)用程序中的數(shù)據(jù)對(duì)象,下面這篇文章主要給大家介紹了關(guān)于透過(guò)Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則的相關(guān)資料,需要的朋友可以參考下2023-06-06