Java 正则表达式:缺少某些组

Java 正则表达式:缺少某些组,java,regex,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) {

我有以下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));
}

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

重复组将包含与组表达式匹配的最后一个子字符串的匹配

如果regexp引擎能够返回与组匹配的所有子字符串,那就太好了。不幸的是,这不受支持:

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

                    0
          _______________________
         /                       \
         (PROD)|(SUM)(\\s+(\\d+))+
         \____/ \___/|    \____/| 
           1      2  |       4  |
                      \________/ 
                           3  
捕获组从左到右索引,从一开始。组0表示整个模式,因此表达式m.Group(0)等价于m.Group()


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

X
来自正则表达式的此部分:

(\\s+(\\d+))+
|          |
+----------+--> X
将首先匹配
12
,然后匹配
32
,最后匹配
42
。每次
X
的值都会更改,并替换上一个值。如果需要所有值,则需要一个
模式
&
匹配器.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 匹配:总和 : 12 : 32 : 42 匹配:PROD : 1 : 2
您会看到打印的
null
,因为在组1中,有
PROD
,您不匹配。

此信息与我的null无关,因为它是由m.group(1)生成的,而不是由m.group(0)生成的。
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