首頁 > 軟體

java字串的替換replace、replaceAll、replaceFirst的區別說明

2022-03-02 10:01:13

字串的替換replace、replaceAll、replaceFirst區別

如果不是剛剛複習了下正規表示式,我可能也不會注意到,原來String的replaceAll跟replaceFirst用到了正規表示式!

不多解釋,看程式碼

String s = "my.test.txt";
System.out.println(s.replace(".", "#"));
System.out.println(s.replaceAll(".", "#"));
System.out.println(s.replaceFirst(".", "#"));

執行結果:

my#test#txt
###########
#y.test.txt

是不是感覺很神奇?

其實懂正規表示式的應該已經發現了,是的,“.”是正規表示式的元字元,匹配除換行符以外的任意字元,所以replaceAll、replaceFirst才出現了這樣的結果。

而replace沒有用到正規表示式,但會把所有“.”替換掉,很多人可能會誤解replace是替換單個,而replaceAll是替換全部,其實這是錯的(我以前也是這麼想的- -)。replace只是沒有用到正規表示式,但會替換所有匹配的字串。

到這裡一些不懂正規表示式的小夥伴可能就要喊坑爹了,“那我不想用正規表示式去替換第一個字串腫麼辦?”其實也很簡單,只要將元字串跳脫就行了。 

s.replaceFirst("\.", "#")

執行結果: 

my#test.txt

這裡給個會被正規表示式識別的字元列表:

  • .匹配除換行符以外的任意字元
  • ^匹配字串的開始
  • $匹配字串的結束
  • *重複零次或更多次
  • +重複一次或更多次
  • ?重複零次或一次

當然,正則可遠不止這麼點,個人建議花點時間去學習一下比較好~

補充:String的split也是用到了正規表示式,使用的時候注意點哦!

replaceAll、replaceFirst使用需要注意的問題

昨天系統報錯,No group 6,上網查詢,說是replaceAll()的問題,就具體試驗了一下,發現如果不注意,就會產生隱含的錯誤。

java的String類的replaceAll方法是一個挺常用的方法,

型別定義如下

String replaceAll(String regex, String replacement)

有兩個引數,第一個是被替換的字串,是正規表示式,另外一個是替換成的字串。

如果我們這樣寫

upLoadedFileName.replaceAll("","/");           // 把//替換為/

是沒有什麼問題的,而且用好正規表示式可以實現很強的功能,如:

str.replaceAll("(?i)"+oldStr,newStr);//忽略大小寫;

但是,使用中我們一定要記住,不僅僅第一個引數是正規表示式,第二個也是,因此如果這兩個是可變引數,就要注意引數的內容,一篇檔案說應該在所有的[ / ^ $ . | ? * + ( ) { }符號前面加上/符號。經過我的測試(jdk1.4),只有/和$容易出錯。

比如:

System.out.println("/".replaceFirst("/", "//"));

系統會報:

java.lang.StringIndexOutOfBoundsException: String index out of range: 1

System.out.println("/".replaceFirst("/", "x//"));

系統會報:

java.lang.StringIndexOutOfBoundsException: String index out of range: 2

System.out.println("/".replaceFirst("/", "//X"));

執行結果是X

System.out.println("/".replaceFirst("/", "$6"));

執行結果丟擲例外:

java.lang.IndexOutOfBoundsException: No group 6

所以如果引數是變數,而且可能包含/或$,建議不要使用replaceAll和replaceFirst方法。

我實現了這兩個方法,大家可以直接參照

   /**
    * 字串替換,從頭到尾查詢一次,替換後的字串不檢查
    * @param str     源字串
    * @param oldStr  目標字串
    * @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;
   }  
   /**
    * 字串替換,左邊第一個。
    * @param str     源字串
    * @param oldStr  目標字串
    * @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("/","/","//"));

結果是/

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com