Java Matcher.group引发IndexOutOfBoundsException异常

Java Matcher.group引发IndexOutOfBoundsException异常,java,regex,pattern-matching,Java,Regex,Pattern Matching,我在下面的代码中尝试使用Matcher.group()打印字符串中的所有匹配项 上述代码在线程“main”java.lang.IndexOutOfBoundsException中引发异常:没有组2异常 所以我的问题是Matcher.group()如何工作,正如您所看到的,我将有3个匹配字符串,如何使用group()打印所有这些字符串 很明显,您只有一个组: ^ak\\s*=\\s*(\\w+) // ^----^----------this is the only group

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

上述代码在线程“main”java.lang.IndexOutOfBoundsException中引发异常:没有组2异常


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

很明显,您只有一个组:

^ak\\s*=\\s*(\\w+)
//          ^----^----------this is the only group 
相反,您必须使用循环,例如:

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

输出

match = foo
match = bar
match = blr05

了解:

捕获组

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


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

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

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

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

每次调用
Matcher#find()
都会对输入字符串从头到尾应用模式,并提供任何匹配项。

您可能需要设置一个断点,检查
Matcher
包含的内容、如何
分组
查找
交互等@luk2302,我确实使用了调试器,但不知道
group
find
如何交互,为什么只有一个组?它是如何创建的,我不能创建多个组,以便不进行迭代就可以将它们全部打印出来。组是在括号之间定义的,因此在您的模式中,您只有
(\\w+)
,这意味着您只有一个组@AmitK明白了吗?非常感谢您的精彩解释+1。
^ak\\s*=\\s*(\\w+)
while (matcher.find()) {
    System.out.println("entire pattern: " + matcher.group(0));
    System.out.println("first capture group: " + matcher.group(1));
}