首页 > 解决方案 > 为什么捕获组中的标志会删除该组?

问题描述

在下面的代码中,(?i:hot)是一个捕获组。或者至少它应该是......它匹配表达式并消耗字符。

但是,当我尝试获取组数时,它返回 0。

Pattern pattern = Pattern.compile("(?i:hot)");
Matcher matcher = pattern.matcher("hot diggity dog");
while (matcher.find()) {
    int groupCount = matcher.groupCount(); // returns 0
    for (int i = 0; i <= groupCount; i++) {
        System.out.printf("%d. %s%n", i, matcher.group(i));
    }
}

括号确实捕获。如您所见,如果我们这样做

matcher.replaceAll("cold")

它会返回“cold diggity dog”

我希望 (?i:hot) 等价于 ((?i)hot),但事实并非如此。后一种情况是捕获组。

这不是Java RegEx Matcher.groupCount 返回 0的副本,因为在那个问题中,确实没有捕获组,所以 groupCount 正确返回 0。但是在我的情况下,这确实应该被视为一个捕获组,因为它确实执行了捕获!

标签: javaregex

解决方案


它在文档中是正确的:

(?idmsux-idmsux: X )   X,作为具有给定标志 idmsux on-off的非捕获组

如果您想要一个捕获组,只需将其包装在另一组括号中:

((?i:hot))

推荐阅读