我无法获得正确的正则表达式匹配组。我的代码归结为以下内容:
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
有没有人解释一下?
Group(0)是整个匹配,group(1),group(2),...是正则表达式匹配的子组。
为什么您期望“测试”包含在您的组中?您没有定义组来匹配测试(您的正则表达式仅包含组 \d*_\d*)。
0组是整场比赛。真正的组从 1 开始,即你需要这个:
System.out.println(fileNameMatcher.group(i + 1));
group(0)
应该是整个匹配项(“test_test_test_test_20110101_0000.xml”);group(1)
应该是正则表达式中唯一的捕获组(“20110101_0000”)。这就是我得到的。我很困惑为什么你会得到不同的
group(1)
值。
实际上你的 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+) 和
匹配第二组将是“20110101_0000”,与 (\d*_\d*) 匹配