Java String.replaceAll不替换美元

Rag*_*eer 1 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);
}
Run Code Online (Sandbox Code Playgroud)

这可以通过\\添加之前添加,$但为什么只有这个角色.

And*_*ner 5

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

String as = s.replaceAll("hello (.*) (\\d*)", "goodbye $2 $1");
Run Code Online (Sandbox Code Playgroud)

当你使用a时$,正则表达式引擎认为你正在尝试引用这样一个组.添加\\逃脱它,使它成为一个字面上的美元.

这在Javadoc中描述:

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