Matcher.group抛出IndexOutOfBoundsException异常

时间:2017-06-03 09:17:20

标签: 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));

    }

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

所以我的问题是Matcher.group()如何工作,你可以看到我将有3个匹配的字符串,如何使用group()打印所有字符串。

2 个答案:

答案 0 :(得分:7)

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

^ak\\s*=\\s*(\\w+)
//          ^----^----------this is the only group 

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

while(matcher.find()){
    System.out.println("match " + matcher.group());
}

<强>输出

match = foo
match = bar
match = blr05

阅读groups

  

捕获群组

     

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

答案 1 :(得分:2)

您似乎对捕获组以及您的字符串中使用给定模式找到的匹配数感到困惑。在您使用的模式中,您只有一个捕获组

^ak\\s*=\\s*(\\w+)

在模式中使用括号标记捕获组。

如果要根据输入字符串检索模式的每个匹配,则应使用while循环:

while (matcher.find()) {
    System.out.println("entire pattern: " + matcher.group(0));
    System.out.println("first capture group: " + matcher.group(1));
}

每次调用Matcher#find()都会对输入字符串应用模式,从开始到结束,并且可以使任何匹配。