Matcher.append用文字文本替换

2022-09-03 03:45:49

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

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

有没有一种方便的方法可以在某个地方用反斜杠来转义所有反斜杠\和美元符号$?还是我必须自己写一个?这听起来并不难,如果他们给你一个>:(

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


答案 1

对替换字符串使用 Matcher.quoteReplacement

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


答案 2

这是另一个选项:

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

appendReplacement()处理在匹配项之间复制文本的工作,然后添加替换文本,避免掺假。如果您动态生成替换文本,这将特别方便,就像 Elliott Hughes 的 Rewriter 一样。StringBuffer#append()