Java Matcher.appends替换为文本

Java Matcher.appends替换为文本,java,regex,Java,Regex,我正在使用它,它工作得很好,直到我的替换字符串中有一个$2: 注意反斜杠(\)和美元 替换字符串中的符号($) 可能会导致结果不同 如果它被视为 文字替换字符串。美元 符号可被视为参考 捕获的子序列如所述 和反斜杠用于 中的转义文字字符 替换字符串 是否有一种方便的方法可以避开所有反斜杠\和带反斜杠的美元符号$?还是我必须自己写一本?听起来没那么难,如果他们给你一个就好了>:( 编辑:因为他们确实给了你一个,我需要替换(“>:(“,”:-)”);在替换字符串上使用 不幸的是,这种情况下的“易用性

我正在使用它,它工作得很好,直到我的替换字符串中有一个$2:

注意反斜杠(\)和美元 替换字符串中的符号($) 可能会导致结果不同 如果它被视为 文字替换字符串。美元 符号可被视为参考 捕获的子序列如所述 和反斜杠用于 中的转义文字字符 替换字符串

是否有一种方便的方法可以避开所有反斜杠\和带反斜杠的美元符号$?还是我必须自己写一本?听起来没那么难,如果他们给你一个就好了>:(

编辑:因为他们确实给了你一个,我需要
替换(“>:(“,”:-)”);

在替换字符串上使用


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

我得到了它来处理以下内容,但我更喜欢Tom Hawtin的解决方案:-)

汤姆的解决方案:

matcher.appendReplacement(stringbuffer, Matcher.quoteReplacement(replacement));
还有一个选择:

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

appendReplacement()
处理在匹配之间复制文本的任务,然后
StringBuffer#append()
添加无掺杂的替换文本。如果动态生成替换文本(如Elliott Hughes中的替换文本),这尤其方便。

嘿,好吧!我怎么会从Javadoc中漏掉这一点?!不幸的是,这种情况下的“易用性”与强类型冲突。“怎么会这样?是的..你能澄清一下“易用性/强类型”注释的意思是?在我看来像是的副本。注意:这不是“如何在Java中转义正则表达式的文本”的副本“。对此很抱歉。我看到#2的答案显示了如何使用quoteReplacement,并且没有费心阅读整个内容。这当然是最好的解决方案,不需要解析和转义替换字符串。非常简单。谢谢!
matcher.appendReplacement(stringbuffer, "");
stringbuffer.append(replacement);