国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - Java中replace、replaceAll和replaceFirst函數的用法小結

Java中replace、replaceAll和replaceFirst函數的用法小結

2020-06-10 11:41楊元 JAVA教程

相信會java的同學估計都用過replace、replaceAll、replaceFirst這三個函數,可是,我們真的懂他們嗎?下面通過這篇文章大家再來好好學習學習下這幾個函數。

首先概述一下他們三個的用法:

· replace(CharSequence target, CharSequence replacement) ,用replacement替換所有的target,兩個參數都是字符串。

· replaceAll(String regex, String replacement) ,用replacement替換所有的regex匹配項,regex很明顯是個正則表達式,replacement是字符串。

· replaceFirst(String regex, String replacement) ,基本和replaceAll相同,區別是只替換第一個匹配項。

接下來有個簡單的需求,就是把源字符串中的a替換成\a,代碼如下:

?
1
2
3
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

結果讓人大吃一驚,用了這么多年的替換,竟然有點蒙了。

源字符串是"abac",然后我們找到"a",把它替換成\a,由于\是java轉義字符,所以想表達\a必須寫成"\\a",第一個反斜線將第二個反斜線轉義成普通字符串。

三個替換表達式,只有第一個replace函數的結果是正確的,問題出在哪呢?

replaceAll和replaceFirst要求第一個參數是正則表達式,"a"既能理解成字符串a,也可以理解成正則表達式a,所以第一個參數沒問題。

問題就出在第二個參數上,如果讀者仔細閱讀replaceAll函數的注釋,會發現有如下說明:

?
1
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的第一個參數是正則,所以我們可以在第二個參數中做些小花樣,比如有這樣一個需求:把源字符串中的a替換成a后邊緊鄰的字符,代碼如下:

?
1
2
System.out.println("abac".replaceAll("a(\\w)", "$1$1")); //bbcc
System.out.println("abac".replaceFirst("a(\\w)", "$1$1")); //bbac

正則的含義假設讀者可以讀懂,可以看出,在第二個參數中,可以用$符號獲取分組的內容,本例中用$1取到了第一個分組的內容,即a后邊緊鄰的字符。

因此,$符號在第二個參數中是有特殊含義的,亂寫會報錯:

?
1
System.out.println("abac".replaceAll("a(\\w)", "$")); //Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1

那假如我就想替換成$呢?這就需要轉義字符:

?
1
System.out.println("abac".replaceAll("a", "\\$")); //$b$c

到這,讀者可能會恍然大悟,原來反斜線在第二個參數中也有特殊含義(轉義),所以如果我們想表達反斜線,就必須再轉義一次:

?
1
2
System.out.println("abac".replaceAll("a", "\\\\a")); //\ab\ac
System.out.println("abac".replaceFirst("a", "\\\\a")); //\abac

簡單理解一下,"\\\\a"中前邊的反斜線分別轉義后邊的反斜線,讓后邊的反斜線就是普通字符串,這樣在java內存中看到的字符串就是"\\a",然后replaceAll函數在處理時,再用前邊的反斜線轉義后邊的反斜線,來表達后邊的反斜線就是普通字符串,不是用來轉義$的,最終內存中的字符串就是"\a",這樣才可以成功將a替換成\a。

總結

轉義的問題確實糾結,通過本文,筆者希望讀者以后使用這些函數時,能夠保持清醒,能夠意識到參數中的特殊字符,避免寫出定時炸彈。以上就是這篇文章的全部內容,希望對大家的學習和工作能有所幫助,如果有疑問可以留言交流。

延伸 · 閱讀

精彩推薦
374
主站蜘蛛池模板: 色婷婷综合网 | 99久久国产露脸国语对白 | 国产精品免费观看 | 久久亚洲综合 | 久久777 | 蜜臀久久99精品久久久无需会员 | 成人av一区二区三区 | 国产精品久久久久久久久 | 国产精品无码永久免费888 | 日韩欧美在线观看视频 | 国产一区二区三区久久久久久久久 | 777色狠狠一区二区三区 | 亚洲精品免费看 | 一区二区三区av | 在线日韩欧美 | 欧美精三区欧美精三区 | 中文字幕亚洲欧美日韩在线不卡 | 91av亚洲| 国产精品99一区二区三区 | 在线观看成人 | 日韩91| 亚洲国产一区二区在线观看 | 91精品久久久久久 | 精品av| 亚洲欧美日韩另类精品一区二区三区 | 国内美女人妻一级毛片免费看 | 欧美日韩成人在线观看 | 国产特级毛片aaaaaaa高清 | 欧美日韩视频 | 国产一级毛片国语一级 | 九九综合| 丁香久久 | 一级电影在线观看 | 国产黄免费 | 艹逼网| 欧美精品一区二区三区蜜桃视频 | 中文字幕视频一区 | 噜噜噜噜噜在线视频 | 四虎影视免费看电影 | 最近2019年好看中文字幕视频 | 在线国产视频观看 |