我有以下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缺少(我希望在群组中找到它们)。
答案 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
给定的字符串与整个模式不匹配。