Why does replaceAll fail with "illegal group reference"?

JavaRegex

Java 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+\\$\\$","$$");

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSathish Kumar k kView Question on Stackoverflow
Solution 1 - JavaAndreyView Answer on Stackoverflow
Solution 2 - JavaKoerrView Answer on Stackoverflow
Solution 3 - JavaHendrik BrummermannView Answer on Stackoverflow
Solution 4 - JavaAugusto SouzaView Answer on Stackoverflow
Solution 5 - Javahrishikesh chaudhariView Answer on Stackoverflow
Solution 6 - JavaIlya GazmanView Answer on Stackoverflow
Solution 7 - JavaAlan MooreView Answer on Stackoverflow
Solution 8 - JavaMohammod HossainView Answer on Stackoverflow