第二个捕获组未捕获

问题描述:

在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)); 
} 

然而,上面的代码输出

true, 2 
I 20151007 090137 - com.example.Main - Main.doStuff (293): ##identifier (id:21): {}; 
21 

但是,在我的 “休息” 组?为什么整条线是一个组?我已经检查了多个在线正则表达式测试网站,它应该可以工作:例如,http://www.regexplanet.com/advanced/java/index.html可以看到3个捕获组。也许这是与我正在使用jdk 1.6的事实有关?

+1

请注意,您不需要使用非贪婪量词来匹配';'最后使用贪婪量词'(。*)'和正则表达式引擎更少的工作完全相同。 –

问题是,groupCount迭代是Java中为数不多的几种情况之一,您实际上需要达到count值来获取所有组。

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

只是增加你的计数器这样(注意<=,而不是仅仅<):

for (int i = 0; i <= m.groupCount(); i++) { 

印刷应该是最后的文本:{}

您也可以跳过组0在启动计数当然,直接使用1。总之,Pattern中带括号的显式组从1开始。

查看文档here