为什么这个正则表达式不能捕获最里面的组?
final String regex = "s(tra(nsformer))";
final Pattern pattern = Pattern.compile(regex);
final Matcher match = pattern.matcher("stransformer");
if (match.matches()) {
System.out.println(match.groupCount());
for (int i = 0; i < match.groupCount(); i++) {
System.out.println(match.group(i));
}
}
以上返回(在jdk7中)
2
变形金刚
变形金刚
奇怪的是,"s(tra((nsformer)))"
模式按预期工作。当我将比赛称为"s(tra(<inner>nsformer))"
group("inner")
也是如此
我们缺少什么?
答案 0 :(得分:1)
组数从1到N。根据Matcher.groupCount()
javadoc:
组零按惯例表示整个模式。它不包括在此计数中。
因此代码应为:
for (int i = 1; i <= match.groupCount(); i++) {
System.out.println(match.group(i));
}
打印:
stransformer
transformer
nsformer
答案 1 :(得分:1)
组计数从索引1开始。索引0包含整个模式。
来自group(int)
的Javadoc:
捕获组从左到右从一个索引开始。 组零表示整个模式,因此表达式m.group(0)为 等同于m.group()。
因此,请确保循环又迭代了一步,例如将<
更改为<=
。
这也解释了为什么当添加一个额外的捕获组时它起作用,计数增加,并且您获得了两个最里面的一个,而不是最后一个。 命名捕获组是有明显原因的(没有错,只是列出它们是错误的)。