Java 如何在匹配器组而不是整个模式上添加替换?

Java 如何在匹配器组而不是整个模式上添加替换?,java,regex,append,matcher,Java,Regex,Append,Matcher,我正在使用while(matcher.find())循环模式的所有匹配项。对于它找到的模式的每个实例或匹配,我想用一些新文本替换matcher.group(3)。每个文本的文本都不同,因此我使用matcher.appendReplacement()在进行新的更改时重新生成原始字符串。但是,appendReplacement()将替换整个模式,而不仅仅是组 我如何做到这一点,但只修改第三组匹配,而不是整个模式 下面是一些示例代码: Pattern pattern = Pattern.compile

我正在使用
while(matcher.find())
循环模式的所有匹配项。对于它找到的模式的每个实例或匹配,我想用一些新文本替换
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));
}
但是我想做这样的事情(显然这不起作用)

类似的东西,它只是取代了某个群体,而不是整个模式


编辑:更改regex示例以显示并非所有模式都已分组。

假设您的整个模式匹配
“(前缀)(中缀)(后缀)”
,将3个部分分别捕获为组1、2和3。现在让我们假设您只想替换第2组(中缀),保持前缀和后缀不变

然后,您要做的是附加
组(1)
匹配的内容(未更改)、组(2)的新替换内容以及组(3)匹配的内容(未更改),如下所示:

matcher.appendReplacement(
    buffer,
    matcher.group(1) + processTheGroup(matcher.group(2)) + matcher.group(3)
);
.appendReplacement("$1" + process(m.group(2)) + "$3");
这仍然会匹配并替换整个图案,但由于组1和组3保持不变,因此实际上只替换中缀


您应该能够针对特定场景采用相同的基本技术。

我认为这已经有了一个公认的答案,但并不完全正确。正确答案似乎是这样的:

matcher.appendReplacement(
    buffer,
    matcher.group(1) + processTheGroup(matcher.group(2)) + matcher.group(3)
);
.appendReplacement("$1" + process(m.group(2)) + "$3");
这也说明“$”在.appendReplacement中是一个特殊字符。因此,您必须在“process()”函数中小心地将所有“$”替换为“\$”。Matcher.quoteReplacement(replacementString)将为您完成此操作(谢谢@Med)


如果第1组或第3组碰巧包含“$”,则先前接受的答案将失败。最后您将看到“java.lang.IllegalArgumentException:非法组引用”

非常感谢。如果模式的某些方面不在组中,是否也有这样做的方法?(我编辑了我的原始帖子示例)如果你必须在匹配中包含这些部分(即,你不能将它们排除在模式之外),然后,您希望将它们捕获到一个组中,以便记住它们匹配的内容,并将它们作为替换的一部分原封不动地放回。请注意,如果其中一个匹配字符串包含
$
,则此操作将失败。请参阅下面的Warrens答案。好的,什么是
processTheGroup()
??我想替换,比如说仅第2组为了解决这个问题,
Matcher.quoteReplacement(replacementString)
做得很好。