正则表达式:某些组缺失

时间:2011-11-03 06:52:18

标签: java regex

我有以下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缺少(我希望在群组中找到它们)。

3 个答案:

答案 0 :(得分:5)

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

如果正则表达式引擎会返回匹配组的所有子串,那将是很好的。不幸的是,这不受支持:

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

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

答案 1 :(得分:4)

来自正则表达式的这一部分的X组:

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

首先匹配12,然后匹配32,最后匹配42。每次X的值都会更改,并替换之前的值。如果您想要所有值,则需要Pattern&amp; Matcher.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());
    }
}

将打印:

Matched : SUM
        : 12
        : 32
        : 42
Matched : PROD
        : 1
        : 2

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

答案 2 :(得分:-1)

I wonder what's a null

捕获组从左到右编制索引,从1开始。组零表示整个模式,因此表达式m.group(0)等同于m.group()。

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

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