如何在Matcher组上追加替换而不是整个模式?
我正在使用while(matcher.find())
循环遍历Pattern的所有匹配项。 对于它找到的那个模式的每个实例或匹配,我想用一些新文本替换matcher.group(3)
。 这个文本对于每个文本都是不同的,所以我使用matcher.appendReplacement()
来重建原始字符串,并使用新的更改。 但是, appendReplacement()
替换整个Pattern,而不仅仅是组。
我该怎么做但只修改匹配的第三组而不是整个模式?
这是一些示例代码:
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)); }
像这样的东西,它只取代某个组,而不是整个模式。
编辑:更改正则表达式示例以显示并非所有模式都已分组。
假设您的整个模式与"(prefix)(infix)(suffix)"
匹配,将3个部分分别捕获到组1,2和3中。 现在让我们假设您只想替换组2(中缀),保留前缀和后缀不变的原样。
然后你做的是你追加哪个group(1)
匹配(未改变), group(2)
替换group(2)
,以及匹配(未改变)的group(3)
),如下所示:
matcher.appendReplacement( buffer, matcher.group(1) + processTheGroup(matcher.group(2)) + matcher.group(3) );
这仍将匹配并替换整个模式,但由于第1组和第3组保持不变,实际上只有中缀被替换。
您应该能够针对您的特定方案调整相同的基本技术。
我看到这已经有了一个可接受的答案,但它并不完全正确。 正确的答案似乎是这样的:
.appendReplacement("$1" + process(m.group(2)) + "$3");
这也说明了“$”是.appendReplacement中的特殊字符。 因此,您必须注意“process()”函数,将所有“$”替换为“\ $”。 Matcher.quoteReplacement(replacementString)会为你做这件事(感谢@Med)
如果组1或组3碰巧包含“$”,则先前接受的答案将失败。 你最终会得到“java.lang.IllegalArgumentException:Illegal group reference”