java - 第二个捕获组不捕获

标签 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\\.doStuff \\(\\d+\\): ##identifier \\(id:(\\d+)\\): (.*?);$"
);

pattern末尾的(.*?)是因为需要贪心,但是把输入行最末尾的;还给.

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 有关?

最佳答案

问题是 groupCount迭代是 Java 中您实际需要到达 count 的少数情况之一。获取所有组的值。

在这种情况下,您需要迭代到组 2 , 自组 0实际上代表了整场比赛。

只需增加您的计数器(注意 <= 而不仅仅是 < ):

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

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

您也可以跳过群组 01 开始计数当然,直接。

总而言之,Pattern 中标记的显式组括号从索引 1 开始.

参见文档 here .

关于java - 第二个捕获组不捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32989336/

相关文章:

java - Spring MVC 模拟

php - 如何使用正则表达式验证 Twitter 用户名

java - 如何在 Intellij 中查找字符串中以大写字母开头的单词?

javascript - 修改正则表达式,以便仅捕获 [a-zA-Z]

java - 正则表达式捕获符号前后的数字

java - 使用 ResultSet.updateRow 函数更新可更新 View 的行

java - android.R.layout.simple_spinner_dropdown_item 和 android.R.layout.simple_spinner_item 的区别

java - 异常 : org. hibernate.SessionException: session 已关闭

regex - 我如何用 sed 表达这个正则表达式?

javascript - 捕获组的效率 (? : => work(? :\s+)? group VERSUS work(\s+)?group