我正在尝试替换包含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);
}
}
答案 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");
答案 1 :(得分:9)
如果您不需要正则表达式功能,请不要使用正则表达式版本。
改为使用String.replace(str, str)
:
String s = "$$$";
String rep = s.replace("$", "€");
System.out.println(rep);
// Output: €€€
<强>参考:强>
答案 2 :(得分:5)
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);
}