为什么replaceAll失败与“非法组参考”?

我需要更换

\\\s+\\$\\$ to $$ 

我用了

 String s = " $$"; s = s.replaceAll("\\s+\\$\\$","$$"); 

但它会抛出exception

java.lang.IllegalArgumentException:非法组引用

在第二个参数中使用"\\$\\$"

 String s=" $$"; s=s.replaceAll("\\s+\\$\\$","\\$\\$"); //or //s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$"); 

$是正则expression式replace参数中的组符号

所以你需要逃避它

来自String#replaceAll javadoc :

请注意replacestring中的反斜杠(\)和美元符号($)可能会导致结果与被视为字面replacestring的结果不同。 看Matcher.replaceAll。 如果需要,使用Matcher.quoteReplacement(java.lang.String)来抑制这些字符的特殊含义。

所以可以像下面这样完成任意replacestring的转义:

 String s = " $$"; s = s.replaceAll("\\s+\\$\\$", Matcher.quoteReplacement("$$")); 

模式#引用也可以逃脱模式

 String s = " $$"; s = s.replaceAll("\\s+" + Pattern.quote("$$"), Matcher.quoteReplacement("$$")); 

这里的问题不是正则expression式,而是replace:

$用于引用()匹配的组。 所以你需要用反斜线(和第二个反斜杠来使java编译器高兴)逃避它:

 String s=" $$"; s = s.replaceAll("\\s+\\$\\$", "\\$\\$"); 

$在replacestring以及正则expression式中有特殊含义,所以你也必须在那里转义它:

 s=s.replaceAll("\\s+\\$\\$", "\\$\\$"); 
 String s="$$"; s=s.replaceAll("\\s+\\$\\$","$$"); 

我有同样的问题,所以我最终实现全部replace拆分。
它解决了我的例外

 public static String replaceAll(String source, String key, String value){ String[] split = source.split(Pattern.quote(key)); StringBuilder builder = new StringBuilder(); builder.append(split[0]); for (int i = 1; i < split.length; i++) { builder.append(value); builder.append(split[i]); } while (source.endsWith(key)) { builder.append(value); source = source.substring(0, source.length() - key.length()); } return builder.toString(); }