如何在Matcher组上追加替换而不是整个模式?

时间:2010-10-15 07:14:00

标签: java regex append matcher

我使用while(matcher.find())循环遍历Pattern的所有匹配项。对于它找到的该模式的每个实例或匹配,我想用一些新文本替换matcher.group(3)。这个文本对于每个文本都是不同的,因此我使用matcher.appendReplacement()来重建原始字符串,并使用新的更改。但是,appendReplacement()会替换整个模式,而不仅仅是组。

我该怎么做但只修改匹配的第三组而不是整个模式?

以下是一些示例代码:

Pattern pattern = Pattern.compile("THE (REGEX) (EXPRESSION) (WITH MULTIPLE) GROUPS");
Matcher matcher = pattern.matcher("THE TEXT TO SEARCH AND MODIFY");
StringBuffer buffer = new StringBuffer();

while(matcher.find()){
   matcher.appendReplacement(buffer, processTheGroup(matcher.group(3));
}

但是我想做这样的事情(显然这不起作用)。

...
while(matcher.find()){
   matcher.group(3).appendReplacement(buffer, processTheGroup(matcher.group(3));
}

类似的东西,它只替换某个组,而不是整个模式。

编辑:更改了正则表达式示例以显示并非所有模式都已分组。

2 个答案:

答案 0 :(得分:31)

我看到这已经有了一个已接受的答案,但它并不完全正确。正确答案似乎是这样的:

.appendReplacement("$1" + process(m.group(2)) + "$3");

这也说明“$”是.appendReplacement中的特殊字符。因此,您必须注意“process()”函数,将所有“$”替换为“\ $”。 Matcher.quoteReplacement(replacementString)将为您完成此任务(感谢@Med)

如果组1或组3碰巧包含“$”,则之前接受的答案将失败。你最终会得到“java.lang.IllegalArgumentException:Illegal group reference”

答案 1 :(得分:17)

假设您的整个模式与"(prefix)(infix)(suffix)"匹配,将3个部分分别捕获到组1,2和3中。现在让我们假设您只想替换第2组(中缀),保留前缀和后缀不变的原样。

然后您执行的操作是追加group(1)匹配(未更改),group(2)的新替换以及group(3)匹配(未更改)的内容,如下所示:

matcher.appendReplacement(
    buffer,
    matcher.group(1) + processTheGroup(matcher.group(2)) + matcher.group(3)
);

这仍将匹配并替换整个模式,但由于第1组和第3组保持不变,实际上只有中继被替换。

您应该能够针对您的特定情况调整相同的基本技术。