我在更换java中的字符串时出现问题...
该行是:
subject = subject.replaceAll("\\[calEvent\\]", calSubject);
此行不适用于calSubject中的$ sign。
主题变量是什么,来自文件的动态主题行变量。例如: Calnot = [calEvent]
我想要做的是用主题变量替换calEvent占位符。但我怎么做它不起作用,因为它在主题包含$符号时崩溃。
任何想法我怎么能这样做,所以如果主题包含$符号或任何字符,它不会破坏?
答案 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);