Java 正则表达式:缺少某些组
我有以下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) {
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