程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中replace、replaceAll和replaceFirst函數的用法小結

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

編輯:關於JAVA

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。

總結

本義的成績確切糾結,經由過程本文,筆者願望讀者今後應用這些函數時,可以或許堅持蘇醒,可以或許認識到參數中的特別字符,防止寫出准時炸彈。以上就是這篇文章的全體內容,願望對年夜家的進修和任務能有所贊助,假如有疑問可以留言交換。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved