我正在使用Matcher.appendReplacement()并且它工作得很好,直到我的替换字符串中有2美元:
请注意反斜杠(\)和美元 替换字符串中的符号($) 可能会导致结果不同 而不是被视为一个 字面替换字符串。美元 标志可以作为参考 捕获的子序列如上所述 上面,反斜杠用于 逃避文字中的字符 替换字符串。
是否有一个方便的方法可以使用反斜杠逃避所有反斜杠\和美元符号$?或者我必须自己写一个?听起来不是那么难,只要他们给你一个> :(
编辑,因为他们确实给了你一个,我需要replace(">:(", ":-)");
答案 0 :(得分:23)
在替换字符串上使用Matcher.quoteReplacement。
不幸的是,在这种情况下,“易用性”与强类型冲突。 [说明:Java静态类型java.lang.String
的对象是char
s的任何不可变序列。它没有告诉你原始数据的格式。在这种情况下,我们可能对用户有意义的文本,用迷你语言编码的文本用于替换,以及用迷你语言编码的文本用于模式。 Java类型系统无法区分这些(尽管您可以使用基于注释的类型检查器来做有趣的事情,通常是为了避免XSS或SQL /命令注入漏洞)。对于模式迷你语言,您可以使用Pattern.compile
进行转换,尽管这是一种特定用途,大多数API方法都忽略它(为了便于使用)。可以写出等效的ReplacementText.compile
。此外,您可以忽略迷你语言,并将库作为“DSL”。但这一切都无助于随意使用。]
答案 1 :(得分:12)
这是另一种选择:
matcher.appendReplacement(stringbuffer, "");
stringbuffer.append(replacement);
appendReplacement()
处理在匹配项之间复制文本的工作,然后StringBuffer#append()
添加替换文字 sans 掺假。如果您动态生成替换文本,这尤其方便,例如Elliott Hughes'Rewriter。
答案 2 :(得分:4)
我得到了以下工作,但我更喜欢Tom Hawtin的解决方案: - )
private static Pattern escapePattern = Pattern.compile("\\$|\\\\");
replacement = escapePattern.matcher(replacement).replaceAll("\\\\$0");
matcher.appendReplacement(stringbuffer, replacement);
汤姆的解决方案:
matcher.appendReplacement(stringbuffer, Matcher.quoteReplacement(replacement));