[英]Java nested regular expression groups not capturing inner groups
为什么此正则表达式未捕获最里面的组?
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)))"
模式可以正常工作。 当我将匹配项称为group("inner")
时, "s(tra(<inner>nsformer))"
也是如此
我们缺少什么?
组计数从1到N。根据Matcher.groupCount()
javadoc:
零组按照惯例表示整个模式。 它不包括在此计数中。
因此代码应为:
for (int i = 1; i <= match.groupCount(); i++) {
System.out.println(match.group(i));
}
打印:
stransformer
transformer
nsformer
组计数从索引1开始。索引0包含整个模式。 从javadoc的group(int)
:
捕获组从左到右从一个索引开始。 组零表示整个模式,因此表达式m.group(0)等效于m.group()。
所以确保循环迭代一个步骤,改变<
至<=
例如。
这也解释了为什么在添加额外的捕获组时它起作用,计数增加,而您却获得了两个最里面的一个,而不是最后一个。 给捕获组命名是有明显原因的(没有错,只列出它们是错的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.