【发布时间】:2019-01-27 04:33:35
【问题描述】:
在以下代码中,(?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 returns 0 的副本,因为在那个问题中,确实没有捕获组,因此 groupCount 正确返回 0。但是在我的情况下,这确实应该被视为捕获组,因为它确实执行捕获!
【问题讨论】:
-
我不认为这是一个捕获组 - 相反,我认为语法
(?i意味着将内部部分解释为带有 @987654329 的 非捕获组 @ 旗帜。字符已被消耗,但未被捕获,可能是regex101.com/r/1yCnzv/1 -
它不是那个的副本。在这种情况下,没有指定捕获组,因此 groupCount 正确返回 0。在我的情况下,模式是从表达式中捕获字符。
-
它不是捕获组。第一个评论者是正确的。参考the documentation。
-
这不是因为
(?:blah)是非捕获组的语法。 阅读文档