Why does replaceAll fail with "illegal group reference"?
JavaRegexJava Problem Overview
I am in need to replace
\\\s+\\$\\$ to $$
I used
String s = " $$";
s = s.replaceAll("\\s+\\$\\$","$$");
but it throws exception
> java.lang.IllegalArgumentException: Illegal group reference
Java Solutions
Solution 1 - Java
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("$$"));
Solution 2 - Java
Use "\\$\\$"
in the second parameter:
String s=" $$";
s=s.replaceAll("\\s+\\$\\$","\\$\\$");
//or
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$");
The $
is group symbol in regex's replacement parameter
So you need to escape it
Solution 3 - Java
The problem here is not the regular expression, but the replacement:
$ is used to refer to ()
matching groups. So you need to escape it as well with a backslash (and a second backslash to make the java compiler happy):
String s=" $$";
s = s.replaceAll("\\s+\\$\\$", "\\$\\$");
Solution 4 - Java
This is the right way. Replace the literar $ by escaped \$
str.replaceAll("\\$", "\\\\\\$")
Solution 5 - Java
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class HelloWorld{
public static void main(String []args){
String msg = "I have %s in my string";
msg = msg.replaceFirst(Pattern.quote("%s"), Matcher.quoteReplacement("$"));
System.out.println(msg);
}
}
Solution 6 - Java
I had the same problem, so I end up implementing replace all with split.
It solved the exception for me
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();
}
Solution 7 - Java
$
has special meaning in the replacement string as well as in the regex, so you have to escape it there, too:
s=s.replaceAll("\\s+\\$\\$", "\\$\\$");
Solution 8 - Java
String s="$$";
s=s.replaceAll("\\s+\\$\\$","$$");