Java中replace、replaceAll和replaceFirst函數的用法小結。本站提示廣大學習愛好者:(Java中replace、replaceAll和replaceFirst函數的用法小結)文章只能為提供參考,不一定能成為您想要的結果。以下是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,代碼以下:
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函數的正文,會發明有以下解釋:
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.quoteWordStrment to suppress the special meaning of these characters, if desired.
因為replaceAll和replaceFirst的第一個參數是正則,所以我們可以在第二個參數中做些小名堂,好比有如許一個需求:把源字符串中的a調換成a後邊緊鄰的字符,代碼以下:
System.out.println("abac".replaceAll("a(\\w)", "$1$1")); //bbcc System.out.println("abac".replaceFirst("a(\\w)", "$1$1")); //bbac
正則的寄義假定讀者可以讀懂,可以看出,在第二個參數中,可以用$符號獲得分組的內容,本例頂用$1取到了第一個分組的內容,即a後邊緊鄰的字符。
是以,$符號在第二個參數中是有特別寄義的,亂寫會報錯:
System.out.println("abac".replaceAll("a(\\w)", "$")); //Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
那假設我就想調換成$呢?這就須要本義字符:
System.out.println("abac".replaceAll("a", "\\$")); //$b$c
到這,讀者能夠會豁然開朗,本來反斜線在第二個參數中也有特別寄義(本義),所以假如我們想表達反斜線,就必需再本義一次:
System.out.println("abac".replaceAll("a", "\\\\a")); //\ab\ac System.out.println("abac".replaceFirst("a", "\\\\a")); //\abac
簡略懂得一下,"\\\\a"中前邊的反斜線分離本義後邊的反斜線,讓後邊的反斜線就是通俗字符串,如許在java內存中看到的字符串就是"\\a",然後replaceAll函數在處置時,再用前邊的反斜線本義後邊的反斜線,來表達後邊的反斜線就是通俗字符串,不是用來本義$的,終究內存中的字符串就是"\a",如許才可以勝利將a調換成\a。
總結
本義的成績確切糾結,經由過程本文,筆者願望讀者今後應用這些函數時,可以或許堅持蘇醒,可以或許認識到參數中的特別字符,防止寫出准時炸彈。以上就是這篇文章的全體內容,願望對年夜家的進修和任務能有所贊助,假如有疑問可以留言交換。