Java String.replaceAll不能取代一美元



我想知道为什么只有$抛出异常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);
}

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

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

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

当您使用 $ 时,正则表达式引擎认为您正在尝试引用这样的组。添加\会逃避它,使其成为字面上的美元。

这在Javadoc中有描述:

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

您可以在文档中找到答案

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

参见

最新更新