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