我想知道为什么只有$
抛出异常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)
来禁止显示这些字符的特殊含义。
您可以在文档中找到答案
请注意,替换中的反斜杠 (( 和美元符号 ($( 字符串可能会导致结果与结果不同 被视为文字替换字符串;
参见