【问题标题】:java.util.regex.Matcher confused groupjava.util.regex.Matcher 混淆组
【发布时间】:2011-04-19 12:58:03
【问题描述】:

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

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

有人解释一下吗?

【问题讨论】:

    标签: java regex matcher regex-group


    【解决方案1】:

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

    【讨论】:

    • 非常感谢!不知道这种默认行为。
    • 是的,我在代码中遗漏了一对括号,只是为了正确起见对其进行了编辑。
    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢!不知道这种默认行为。
    【解决方案3】:
    • group(0) 应该是整个匹配项(“test_test_test_test_20110101_0000.xml”);
    • group(1) 应该是您的正则表达式中的唯一捕获组(“20110101_0000”)。

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

    【讨论】:

    • 谢谢我现在明白了 :) 很抱歉我在代码中忘记了一些括号,请参阅我的编辑。
    【解决方案4】:

    实际上你的 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*) 匹配

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      相关资源
      最近更新 更多