Java正则表达式捕获组

23

我正在尝试使用java表达式捕获“:”后面的正确部分,但在以下代码中,打印的捕获组是整个字符串,出了什么问题?

String s ="xyz: 123a-45";   
String patternStr="xyz:[ \\t]*([\\S ]+)";
Pattern p = Pattern.compile(patternStr);
Matcher m = p.matcher(s);
//System.err.println(s);
if(m.find()){
    int count = m.groupCount();
    System.out.println("group count is "+count);
    for(int i=0;i<count;i++){
        System.out.println(m.group(i));
    }
}
2个回答

29

子组编号从1开始,0代表全部文本。在循环中一直进行到count+1。


8
更精确地说,将 for 循环的条件改为 i<=count - Tim Pietzcker

1
这是因为组的索引从1开始。组0是整个模式。
从JavaDoc中可以看到:“捕获组从左到右按顺序编号,从1开始。组零表示整个模式,因此表达式m.group(0)等同于m.group()。” 更多信息请参见此处

我认为这种混淆源于文档将“索引”(始终从0开始)与“编号”(可以从任何值开始)混淆了。 - william.berg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接