java.util.regex.Matcher困惑组
我无法获得正确的正则表达式匹配组。 我的代码归结为以下内容:
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
有没有人有解释?
组(0)是整个匹配,组(1),组(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循环应该使用“< = ”INCLUDE 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 *)匹配