【问题标题】:Regular expressions: some groups missing正则表达式:缺少一些组
【发布时间】:2011-11-03 06:52:17
【问题描述】:

我有以下 Java 代码:

String s2 = "SUM   12  32 42";
Pattern pat1 = Pattern.compile("(PROD)|(SUM)(\\s+(\\d+))+");
Matcher m = pat1.matcher(s2);
System.out.println(m.matches());
System.out.println(m.groupCount());
for (int i = 1; i <=  m.groupCount(); ++i) {
        System.out.println(m.group(i));
}

产生:

true
4
null
SUM
 42
42

我想知道null 是什么以及为什么缺少 12 和 32(我希望在组中找到它们)。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    重复的组将包含与该组的表达式匹配的 last 子字符串的匹配项。

    如果正则表达式引擎能够返回匹配组的 all 子字符串,那就太好了。不幸的是,这不受支持:

    另外的组是静态的,编号如下:

                        0
              _______________________
             /                       \
             (PROD)|(SUM)(\\s+(\\d+))+
             \____/ \___/|    \____/| 
               1      2  |       4  |
                          \________/ 
                               3  
    

    【讨论】:

      【解决方案2】:

      从你的这部分正则表达式中分组X

      (\\s+(\\d+))+
      |          |
      +----------+--> X
      

      将首先匹配12,然后是32,最后是42。每次X 的值都会更改,并替换之前的值。如果您想要 所有 值,则需要 PatternMatcher.find() 方法:

      String s = "SUM   12  32 42 PROD 1 2";
      Matcher m = Pattern.compile("(PROD|SUM)((\\s+\\d+)+)").matcher(s);
      while(m.find()) {
          System.out.println("Matched : " + m.group(1));
          Matcher values = Pattern.compile("\\d+").matcher(m.group(2));
          while(values.find()) {
              System.out.println("        : " + values.group());
          }
      }
      

      将打印:

      匹配:SUM
              : 12
              : 32
              : 42
      匹配:产品
              : 1
              : 2

      您会看到打印了 null,因为在第 1 组中,有 PROD,您不匹配。

      【讨论】:

        【解决方案3】:
        I wonder what's a null
        

        捕获组的索引从左到右,从一个开始。第 0 组表示整个模式,因此表达式 m.group(0) 等价于 m.group()。

        http://download.oracle.com/javase/1.5.0/docs/api/java/util/regex/Matcher.html#group%28int%29

        给定的字符串与整个模式不匹配。

        【讨论】:

        • 此信息与我的 null 无关,因为它是由 m.group(1) 而不是 m.group(0) 产生的。
        猜你喜欢
        • 2018-07-26
        • 2012-12-29
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 2014-06-25
        • 2015-09-07
        相关资源
        最近更新 更多