我有一段时间让这个正则表达式输出我期望的组:
Pattern p = Pattern.compile("(point) (.*)");
Matcher m = p.matcher("point 0 0 255 0 0");
if (m.find()) {
for (int i = 0; i < m.groupCount(); i++) {
System.out.println("-- " + m.group(i));
}
}
我希望看到这个输出:
point 0 0 255 0 0 // this is group 0
point
0 0 255 0 0
相反,我得到了小组0
和1
- 最后一组没有。
我不知道自己做错了什么。
从长远来看,我试图匹配(point|rect|line)
和可变数量的整数。
...谢谢
答案 0 :(得分:1)
您没有打印所有组。试试for (int i = 0; i <= m.groupCount(); i++)
答案 1 :(得分:1)
组0
始终引用最初匹配的字符串 - 在您的示例中为point 0 0 255 0 0
。
因此,模式中的编号的捕获组由基于1的索引引用 - 在示例组1
中,组2
。
这是与其他编程语言相关的常见习惯--JavaScript和Perl也将索引零匹配(在“替换”函数中也称为\0
)表示为整个匹配字符串。
因此,要输出预期的捕获组,您需要从0循环到2或从1循环到2:
for (int i = 0; i <= m.groupCount(); i++) {
// ^-- changed "<" to "<="
System.out.println("-- " + m.group(i));
}
Output:
point 0 0 255 0 0
point
0 0 255 0 0
答案 2 :(得分:0)
查看https://docs.oracle.com/javase/7/docs/api/java/util/regex/MatchResult.html上的MatchResult参考,然后检查&#39; groupCount&#39;部分。据说,第0组按惯例表示整个模式,不包括在此计数中。