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

Oak*_*ork 9 java regex string

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

这条线是:

subject = subject.replaceAll("\\[calEvent\\]", calSubject);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

zak*_*ter 21

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

subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject));
Run Code Online (Sandbox Code Playgroud)

来自以下文件String.replaceAll():

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

注意,美元符号被用来指相应的捕获组正则表达式($0,$1等).

编辑

Matcher.quoteReplacement()已经在Java 1.5中引入了,如果你遇到Java 1.4,你必须$通过\$在字符串中替换它来手动转义.但是既然你String.replaceAll()也需要使用\$你一样的特殊字符来逃避它们,你也必须再次逃避\Java运行时.

("$", "\$") /* what we want */
("\$", "\\\$") /* RegExp engine escape */
("\\$", "\\\\\\$") /* Java runtime escape */
Run Code Online (Sandbox Code Playgroud)

所以我们得到:

calSubject = calSubject.replaceAll("\\$", "\\\\\\$");  
Run Code Online (Sandbox Code Playgroud)


Ken*_*ent 5

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

它也可以保存你的"逃逸"反斜杠.

api doc:

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