Java正则表达式捕获数字组

时间:2016-01-04 18:37:44

标签: java regex

我有一段时间让这个正则表达式输出我期望的组:

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

相反,我得到了小组01 - 最后一组没有。

我不知道自己做错了什么。

从长远来看,我试图匹配(point|rect|line)和可变数量的整数。

...谢谢

3 个答案:

答案 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组按惯例表示整个模式,不包括在此计数中。