Java String.replaceAll不替换美元

时间:2017-06-20 09:52:24

标签: java

我想知道为什么只有$抛出java.lang.IllegalArgumentException: Illegal group reference例外而不是任何其他特殊字符:

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

这可以通过在\\之前添加的$来克服,但为什么只为此角色添加。

2 个答案:

答案 0 :(得分:5)

您可以在第一个参数中捕获组,并在第二个参数中使用它们来表示"插入您在此处匹配的位":

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

当您使用$时,正则表达式引擎会认为您正在尝试引用此类组。添加\\会使其失效,使其成为一个字面上的美元。

Javadoc

中对此进行了描述
  

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同;见Matcher.replaceAll。如果需要,使用Matcher.escapeReplacement(java.lang.String)来抑制这些字符的特殊含义。)

答案 1 :(得分:1)

您可以在Documentation

中找到答案
  

请注意替换中的反斜杠()和美元符号($)   字符串可能会导致结果与正确的结果不同   被视为文字替换字符串;

请参阅also