Why does replaceAll fail with “illegal group reference”?

From String#replaceAll javadoc:

Note that backslashes (\) and dollar signs ($) in the replacement
string may cause the results to be different than if it were being
treated as a literal replacement string; see Matcher.replaceAll. Use
Matcher.quoteReplacement(java.lang.String) to suppress the special
meaning of these characters, if desired.

So escaping of an arbitrary replacement string can be done using Matcher#quoteReplacement:

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

Also escaping of the pattern can be done with Pattern#quote

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

Leave a Comment