Matcher.appendReplacement与文字文本

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

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同。 如上所述,美元符号可被视为对捕获的子序列的引用,反斜杠用于替换替换字符串中的文字字符。

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

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

在替换字符串上使用Matcher.quoteReplacement 。

不幸的是,在这种情况下,“易用性”与强类型冲突。 [解释:Java静态类型java.lang.String的对象是任何不可变的char序列。 它不会告诉您原始数据的格式。 在这种情况下,我们的文本可能对用户有意义,用迷你语言编码的文本用于替换,文本用迷你语言编码用于模式。 Java类型系统无法区分这些(尽管您可以使用基于注释的类型检查器来做有趣的事情,通常是为了避免XSS或SQL /命令注入漏洞)。 对于模式迷你语言,您可以使用Pattern.compile进行转换,尽管这是一种特定用途,并且大多数API方法都忽略它(为了便于使用)。 可以编写等效的ReplacementText.compile 。 此外,您可以忽略迷你语言并将库作为“DSL”。 但这一切都无助于随意使用。]

这是另一种选择:

 matcher.appendReplacement(stringbuffer, ""); stringbuffer.append(replacement); 

appendReplacement()处理在匹配之间复制文本的工作,然后StringBuffer#append()添加替换文本没有掺杂。 如果您动态生成替换文本,这在Elliott Hughes的重写器中尤为方便。

我让它与以下工作,但我更喜欢汤姆霍廷的解决方案:-)

 private static Pattern escapePattern = Pattern.compile("\\$|\\\\"); replacement = escapePattern.matcher(replacement).replaceAll("\\\\$0"); matcher.appendReplacement(stringbuffer, replacement); 

汤姆的解决方案:

 matcher.appendReplacement(stringbuffer, Matcher.quoteReplacement(replacement));