为什么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(); }