Matcher.appendReplacement与文字文本

时间:2009-06-03 20:42:10

标签: java regex

我正在使用Matcher.appendReplacement()并且它工作得很好,直到我的替换字符串中有2美元:

  

请注意反斜杠(\)和美元   替换字符串中的符号($)   可能会导致结果不同   而不是被视为一个   字面替换字符串。美元   标志可以作为参考   捕获的子序列如上所述   上面,反斜杠用于   逃避文字中的字符   替换字符串。

是否有一个方便的方法可以使用反斜杠逃避所有反斜杠\和美元符号$?或者我必须自己写一个?听起来不是那么难,只要他们给你一个> :(

编辑,因为他们确实给了你一个,我需要replace(">:(", ":-)");

3 个答案:

答案 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));