java.util.regex.Matcher困惑组

时间:2011-04-19 12:58:04

标签: java regex matcher regex-group

我无法获得正确的正则表达式匹配组。我的代码归结为以下内容:

Pattern fileNamePattern = Pattern.compile("\\w+_\\w+_\\w+_(\\w+)_(\\d*_\\d*)\\.xml");
Matcher fileNameMatcher = fileNamePattern.matcher("test_test_test_test_20110101_0000.xml");

System.out.println(fileNameMatcher.groupCount());

if (fileNameMatcher.matches()) {
    for (int i = 0; i < fileNameMatcher.groupCount(); ++i) {
        System.out.println(fileNameMatcher.group(i));
    }
}

我希望输出为:

2
test
20110101_0000

然而它的:

2
test_test_test_test_20110101_0000.xml
test

有没有人有解释?

4 个答案:

答案 0 :(得分:5)

组(0)是整个匹配,组(1),组(2),...是由正则表达式匹配的子组。
为什么您希望“测试”包含在您的组中?您没有定义要匹配测试的组(您的正则表达式只包含组\ d * _ \ d *)。

答案 1 :(得分:2)

组0是整场比赛。真正的小组从1开始,即你需要这个:

System.out.println(fileNameMatcher.group(i + 1)); 

答案 2 :(得分:2)

  • group(0)应该是整个匹配(“test_test_test_test_20110101_0000.xml”);
  • group(1)应该是正则表达式中唯一的捕获组(“20110101_0000”)。

这就是我所得到的。我很困惑为什么你会为group(1)获得不同的价值。

答案 3 :(得分:2)

实际上你的for循环应该使用“&lt; = ”来包含groupCount():

for (int i = 0; i <= fileNameMatcher.groupCount(); ++i) {
    System.out.println(fileNameMatcher.group(i));
}

因此你的输出将是:

2
test_test_test_test_20110101_0000.xml
test
20110101_0000

groupCount()不会计算与整个字符串匹配的组0。

第一组将是“测试”,与(\ w +)和

匹配

第二组将是“20110101_0000”,匹配为(\ d * _ \ d *)