Java 第二个捕获组未捕获

Java 第二个捕获组未捕获,java,regex,capturing-group,Java,Regex,Capturing Group,在java中,我一直在尝试使用正则表达式解析日志文件。在日志文件的一行下面 I 20151007 090137 - com.example.Main - Main.doStuff (293): ##identifier (id:21): {}; 我需要行末尾的json字符串和id。这意味着我需要两个捕获组。于是我开始编码 Pattern p = Pattern.compile( "^I [0-9]{8} [0-9]{6} - com\\.example\\.Main - Main\\.do

在java中,我一直在尝试使用正则表达式解析日志文件。在日志文件的一行下面

I 20151007 090137 - com.example.Main - Main.doStuff (293): ##identifier (id:21): {};
我需要行末尾的json字符串和id。这意味着我需要两个捕获组。于是我开始编码

Pattern p = Pattern.compile(
  "^I [0-9]{8} [0-9]{6} - com\\.example\\.Main - Main\\.doStuff \\(\\d+\\): ##identifier \\(id:(\\d+)\\): (.*?);$"
);
模式末尾的
(.*?
是因为它需要贪婪,但要返回
位于输入行的最末端

Matcher m = p.matcher(readAboveLogfileLineToString());
System.err.println(m.matches() + ", " + m.groupCount());
for (int i = 0; i < m.groupCount(); i++) {
    System.out.println(m.group(i));
}

但我的“休息”小组在哪里?为什么整条线都是一组?我检查了多个在线正则表达式测试站点,它应该可以工作:例如,看到3个捕获组。也许这与我目前正在使用jdk 1.6有关?

问题在于
groupCount
迭代是Java中少数几个需要达到
count
值才能获得所有组的情况之一

在这种情况下,您需要迭代到组
2
,因为组
0
实际上代表整个匹配


只需增加计数器本身(请注意,
注意,不需要使用非贪婪量词来匹配
最后,使用贪婪量词
(.*)
对正则表达式引擎的工作量更少,效果也完全相同。
true, 2
I 20151007 090137 - com.example.Main - Main.doStuff (293): ##identifier (id:21): {};
21
for (int i = 0; i <= m.groupCount(); i++) {