Java正则表达式没有捕获最正确编号的组

时间:2018-01-24 19:50:08

标签: java regex

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import amdocs.mcfw.constants.McConstants.MappingRegExConstants;

public class RegExTest {

    public static final String DECLARATION_REGEX = "(int|long)\\s*(\\S+);";

    public static void main(String[] args) {

        String str = "int a;";
        Pattern p = Pattern.compile(DECLARATION_REGEX);
        Matcher matcher = p.matcher(str);
        System.out.println(matcher);
        printGroups(matcher);

    }

    private static void printGroups(Matcher m) {

        System.out.println(m.find());
        for (int i = 0; i < m.groupCount(); i++) {
            System.out.println(i +": " +m.group(i));

        }

    }
}

上面的代码说明了一个RegEx来匹配一个声明指令,我希望输出中的3个组如下所示。

0:int a - &gt;完全匹配

1:int - &gt;型

2:a - &gt; Var名称

但我只得到前两组而不是第三组。实际上我已经尝试了很多问题的变化,似乎RegEx引擎总是丢弃最右边编号的组,直到你用另一个编号组明确地包装最右边编号的组,即在我们的例子中重写“(\\ S +)”as “((\\ S +))”解决了这个问题。

但问题是,如果根据文档,您在圆括号下定义的内容将被捕获为一个数字组,为什么我们必须用两组括号覆盖最右边的组?

1 个答案:

答案 0 :(得分:0)

我没有遍历所有组。事实上,regEx引擎始终将整个匹配作为第0组意味着groupCount将始终比预期组多一个。