2011-07-28 108 views
23

我想捕捉正确的部分之后:使用java expr,但在下面的代码中,打印的捕获组是整个字符串,怎么了?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)); 
    } 
} 

回答

29

小组编号从1开始,0是全文。只要去你的循环计数+ 1。

+8

更确切地说,将'for'循环条件改为'i <= count'。 –

1

这是因为组的索引以1开始。组0是整个模式。

从JavaDoc:“捕获组是从左到右索引的,从1开始.0组表示整个模式,因此表达式m.group(0)等同于m.group()。” 查看更多here

+0

我认为这种混淆源于这样的事实,即文档混淆了“索引”(总是从0)到“编号”(无论您喜欢什么值)。 –