5

我正在尝试替换包含字符“$”的子字符串。我很高兴听到它为什么不能那样工作,以及它是如何工作的。

谢谢, user_unknown

public class replaceall {
    public static void main(String args[]) {
        String s1= "$foo - bar - bla";
        System.out.println("Original string:\n"+s1);
        String s2 = s1.replaceAll("bar", "this works");
        System.out.println("new String:\n"+s2);
        String s3 = s2.replaceAll("$foo", "damn");
        System.out.println("new String:\n"+s3);
    }

}
4

4 回答 4

14

Java.replaceAll隐式使用正则表达式来替换。这意味着,$foo被解释为正则表达式模式,并且$在正则表达式中是特殊的(意思是“字符串结尾”)。

你需要逃避$as

String s3 = s2.replaceAll("\\$foo", "damn");

如果目标是变量,使用Pattern.quote转义 Java ≥1.5 上的所有特殊字符,如果替换也是变量,使用Matcher.quoteReplacement.

String s3 = s2.replaceAll(Pattern.quote("$foo"), Matcher.quoteReplacement("damn"));

在 Java ≥1.5 上,您可以使用.replace.

String s3 = s2.replace("$foo", "damn");

结果:http ://www.ideone.com/Jm2c4

于 2010-11-05T12:33:08.957 回答
9

如果您不需要正则表达式功能,请不要使用正则表达式版本。

改用String.replace(str, str)

String s = "$$$";
String rep = s.replace("$", "€");
System.out.println(rep);
// Output: €€€

参考:

于 2010-11-05T12:37:43.137 回答
5

IIRC,replaceAll 采用正则表达式:尝试以这种方式转义 $:

String s3 = s2.replaceAll("\\$foo", "damn");
于 2010-11-05T12:32:08.810 回答
0
public static String safeReplaceAll(String orig, String target, String replacement) {
    replacement = replacement.replace("$", "\\$");
    return orig.replaceAll(target, replacement);
}
于 2012-03-01T17:04:18.370 回答