11

我在替换java中的字符串时遇到问题...

该行是:

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

此行不适用于 $ 登录 calSubject。

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

我想要做的是用主题变量替换 calEvent 占位符。但是我是如何做到的却不起作用,因为当主题包含 $ 符号时它会崩溃。

知道如何做到这一点,因此如果主题包含 $ 符号或任何字符,它就不会中断?

4

5 回答 5

23

那是因为美元符号是替换字符串中的特殊字符,Matcher.quoteReplacement()用于转义这种字符。

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

来自以下文档String.replaceAll()

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

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

编辑

Matcher.quoteReplacement()已在 Java 1.5 中引入,如果您卡在 Java 1.4 中,则必须$通过将其替换\$为字符串内部来手动转义。但是因为String.replaceAll()也会将\and$作为特殊字符,所以您必须将它们转义一次,并且您还必须\为 Java 运行时再次转义所有字符。

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

所以我们得到:

calSubject = calSubject.replaceAll("\\$", "\\\\\\$");  
于 2013-04-15T15:23:06.970 回答
5

如果不需要这个regex特性,可以考虑使用String类的这个方法: replace(CharSequence target,CharSequence replacement)

它还可以保存您的“转义”反斜杠。

api文档:

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

于 2013-04-15T15:22:58.760 回答
2

从 replaceAll 的文档中:

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

在 Matcher.replaceAll

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

于 2013-04-15T15:23:26.473 回答
0

请用

Matcher.quoteReplacement(calEvent);
于 2013-04-15T15:24:51.630 回答
0

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

subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject));
于 2013-04-15T15:24:38.823 回答