替换substring(replaceAll)变通方法

时间:2010-11-05 12:30:43

标签: java string substring replaceall

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

谢谢, 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 个答案:

答案 0 :(得分:14)

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

您需要将$转义为

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时,你可以use .replace instead

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

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

答案 1 :(得分:9)

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

改为使用String.replace(str, str)

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

<强>参考:

答案 2 :(得分:5)

IIRC,替换所有采取正则表达式:尝试以这种方式逃避$:

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

答案 3 :(得分:0)

public static String safeReplaceAll(String orig, String target, String replacement) {
    replacement = replacement.replace("$", "\\$");
    return orig.replaceAll(target, replacement);
}