为什么Matcher.group抛出IndexOutOfBoundsException异常

Ami*_*wal 4 java regex pattern-matching

我在下面的代码,我试图在使用字符串打印所有匹配Matcher.group().

public static void main(String[] args) {
        String s = "foo\r\nbar\r\nfoo"
                + "foo, bar\r\nak  = "
                + "foo, bar\r\nak  = "
                + "bar, bar\r\nak  = "
                + "blr05\r\nsdfsdkfhsklfh";
        //System.out.println(s);
        Matcher matcher = Pattern.compile("^ak\\s*=\\s*(\\w+)", Pattern.MULTILINE)
                .matcher(s);
        matcher.find();
        // This one works
        System.out.println("first match " + matcher.group(1));
        // Below 2 lines throws IndexOutOfBoundsException
        System.out.println("second match " + matcher.group(2));
        System.out.println("third match " + matcher.group(3));

    }
Run Code Online (Sandbox Code Playgroud)

上面的代码在线程"main"中抛出异常java.lang.IndexOutOfBoundsException:No group 2 Exception.

所以我的问题是如何Matcher.group()工作和你可以看到我将有3个匹配的字符串,我怎么能用它打印所有这些group().

YCF*_*F_L 7

很明显,你只有一个小组:

^ak\\s*=\\s*(\\w+)
//          ^----^----------this is the only group 
Run Code Online (Sandbox Code Playgroud)

相反,你必须使用一个循环,例如:

while(matcher.find()){
    System.out.println("match " + matcher.group());
}
Run Code Online (Sandbox Code Playgroud)

输出

match = foo
match = bar
match = blr05
Run Code Online (Sandbox Code Playgroud)

阅读有关群组:

捕获组

括号将它们之间的正则表达式组合在一起.它们将与其中的正则表达式匹配的文本捕获到编号组中,该组可以使用带编号的反向引用进行重用.它们允许您将正则表达式运算符应用于整个分组正则表达式.