2017-06-20 18 views
0

我想知道爲什麼只有$拋出java.lang.IllegalArgumentException: Illegal group reference例外,而不是其他任何特殊字符:的Java String.replaceAll不替代美元

public static void main(String[] args) { 
    String s = "asdf ok done %test%"; 
    String as=s.replaceAll("%test%", "$dsf"); 
    System.out.println(as); 
} 

這可以通過$但在此之前加了\\克服爲什麼只爲這個角色。

回答

4

您可以捕捉到第一個參數組,並利用它們的第二個參數是指「插入你在這裏匹配位」:

String as = s.replaceAll("hello (.*) (\\d*)", "goodbye $2 $1"); 

當您使用$,正則表達式引擎認爲你試圖引用這樣一個組。添加\\逃脫它,使其成爲一個字面美元。

這在Javadoc描述:

注意反斜槓(\)和美元符號($)在替換字符串可能導致的結果是不同的比如果它正在視爲文字置換串;請參閱Matcher.replaceAll。如果需要,使用Matcher.escapeReplacement(java.lang.String)來壓制這些字符的特殊含義。)

1

您可以找到Documentation

注意答案的是,在更換 字符串反斜槓()和美元符號($)可能導致的結果是不同的比,如果它正在 視爲文字替換字符串;

also

+0

這是更多的評論我感覺@anton –