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
有人有解释吗?
已邀请:
Group(0)是整个匹配项,而group(1),group(2),...是通过正则表达式匹配的子组。 为什么您希望组中包含“测试”?您没有定义匹配测试的组(您的正则表达式仅包含组\\ d * _ \\ d *)。
组0是整个比赛。实际组以1开头,即您需要:
System.out.println(fileNameMatcher.group(i + 1)); 
group(0)
应该是整个匹配项(\“ test_test_test_test_test_20110101_0000.xml \”);
group(1)
应该是您的正则表达式(\“ 20110101_0000 \”)中的唯一捕获组。 这就是我得到的。我为你为什么要得到5英镑的不同价值而感到困惑。
实际上,您的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进行计数。 第一组将是\“ test \”,由(\\ w +)和 第二组将是\“ 20110101_0000 \”,并由(\\ d * _ \\ d *)匹配

要回复问题请先登录注册