1

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

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

4 回答 4

6

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

于 2011-04-19T13:04:05.377 回答
2

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

System.out.println(fileNameMatcher.group(i + 1)); 
于 2011-04-19T13:01:29.753 回答
2
  • group(0)应该是整个匹配(“test_test_test_test_20110101_0000.xml”);
  • group(1)应该是您的正则表达式中的唯一捕获组(“20110101_0000”)。

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

于 2011-04-19T13:02:31.443 回答
2

实际上你的 for 循环应该包括 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+) 匹配的“测试”,并且

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

于 2014-02-24T20:23:33.373 回答