79

我需要更换

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

我用了

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

但它抛出异常

java.lang.IllegalArgumentException:非法组引用

4

8 回答 8

112

String#replaceAll javadoc

请注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同;请参阅 Matcher.replaceAll。如果需要,使用 Matcher.quoteReplacement(java.lang.String) 来抑制这些字符的特殊含义。

因此,可以使用Matcher#quoteReplacement转义任意替换字符串:

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

也可以使用Pattern#quote完成模式的转义

String s = "  $$";
s = s.replaceAll("\\s+" + Pattern.quote("$$"), Matcher.quoteReplacement("$$"));
于 2013-11-15T13:54:58.410 回答
60

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

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

$正则表达式的替换参数中的is 组符号

所以你需要逃避它

于 2012-08-11T10:09:51.650 回答
6

这里的问题不是正则表达式,而是替换:

$ 用于指代()匹配组。因此,您还需要使用反斜杠(以及第二个反斜杠以使 java 编译器满意)对其进行转义:

String s="  $$";
s = s.replaceAll("\\s+\\$\\$", "\\$\\$");
于 2012-08-11T10:10:00.747 回答
2

这是正确的方法。用转义的 \\$ 替换文字 $ str.replaceAll("\\$", "\\\\\\$")

于 2017-12-14T17:47:09.733 回答
2
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);
 }

}

于 2020-01-15T10:45:26.283 回答
1

我遇到了同样的问题,所以我最终实现了用 split 替换所有内容。
它为我解决了异常

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();
}
于 2017-01-12T18:51:46.537 回答
0

$在替换字符串和正则表达式中具有特殊含义,因此您也必须在此处对其进行转义:

s=s.replaceAll("\\s+\\$\\$", "\\$\\$");
于 2012-08-11T10:10:21.060 回答
0
String s="$$";
        s=s.replaceAll("\\s+\\$\\$","$$");
于 2012-08-11T10:12:12.547 回答