在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的事实有关?
答案 0 :(得分:3)
问题在于groupCount
迭代是Java中为数不多的情况之一,您实际需要达到count
值以获取所有组。
在这种情况下,您需要迭代到2
组,因为组0
实际上代表整个匹配。
只需递增你的计数器(注意<=
而不只是<
):
for (int i = 0; i <= m.groupCount(); i++) {
最后打印的文字应为:{}
当然,您也可以直接跳过0
组1
。
总而言之,带有括号的Pattern
中标记的显式组从索引1
开始。
请参阅文档here。