Java嵌套的正则表达式组无法捕获内部组

时间:2019-01-08 22:44:29

标签: java

为什么这个正则表达式不能捕获最里面的组?

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")也是如此

我们缺少什么?

2 个答案:

答案 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()。

因此,请确保循环又迭代了一步,例如将<更改为<=

Matcher.group(int) javadoc

这也解释了为什么当添加一个额外的捕获组时它起作用,计数增加,并且您获得了两个最里面的一个,而不是最后一个。 命名捕获组是有明显原因的(没有错,只是列出它们是错误的)。