字符串替换使用$ sign抛出错误

时间:2013-04-15 15:17:03

标签: java regex string

我在更换java中的字符串时出现问题...

该行是:

subject = subject.replaceAll("\\[calEvent\\]", calSubject);

此行不适用于calSubject中的$ sign。

主题变量是什么,来自文件的动态主题行变量。例如: Calnot = [calEvent]

我想要做的是用主题变量替换calEvent占位符。但我怎么做它不起作用,因为它在主题包含$符号时崩溃。

任何想法我怎么能这样做,所以如果主题包含$符号或任何字符,它不会破坏?

5 个答案:

答案 0 :(得分:21)

那是因为美元符号是替换字符串中的特殊字符,使用Matcher.quoteReplacement()来逃避这种字符。

subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject));

来自String.replaceAll()的文件:

  

请注意替换中的反斜杠(\)和美元符号($)   字符串可能会导致结果与正确的结果不同   被视为字面替换字符串;见Matcher.replaceAll。使用   Matcher.quoteReplacement(java.lang.String)压制特殊   如果需要,这些字符的含义。

请注意,美元符号用于引用正则表达式($0$1等)中的相应捕获组。

修改

Java 1.5中引入了

Matcher.quoteReplacement(),如果你遇到Java 1.4,你必须通过在字符串中用$替换它来手动转义\$。但由于String.replaceAll()也会将\$作为特殊字符,因此您必须将它们一次性转义,并且还必须再次为Java运行时转义所有\

("$", "\$") /* what we want */
("\$", "\\\$") /* RegExp engine escape */
("\\$", "\\\\\\$") /* Java runtime escape */

所以我们得到:

calSubject = calSubject.replaceAll("\\$", "\\\\\\$");  

答案 1 :(得分:5)

如果您不需要regex功能,可以考虑使用String类的这种方法: replace(CharSequence target,CharSequence replacement)

它也可以保存你的“逃逸”反斜杠。

api doc:

  

替换此字符串中与文字目标匹配的每个子字符串   具有指定文字替换序列的序列。该   替换从字符串的开头到结尾,为   例如,在字符串“aaa”中将“aa”替换为“b”将导致   “ba”而不是“ab”。

答案 2 :(得分:2)

来自replaceAll的文档:

  

请注意替换中的反斜杠()和美元符号($)   字符串可能会导致结果与正确的结果不同   被视为字面替换字符串;见Matcher.replaceAll。使用   java.util.regex.Matcher.quoteReplacement压制特殊   如果需要,这些字符的含义。

在Matcher.replaceAll

  

可以将美元符号视为对捕获的子序列的引用   如上所述,反斜杠用于转义文字字符   在替换字符串中。

答案 3 :(得分:0)

不确定我是否真的理解您的问题,但请尝试

subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject));

答案 4 :(得分:0)

请使用

Matcher.quoteReplacement(calEvent);