public class Question {
public static void main(String[] args) {
String regex="(go\\w*\\s*)(to\\w*\\s*)(work\\w*\\s*)";
       Pattern pattern=Pattern.compile(regex);
       Matcher matcher=pattern.matcher("Let's go to1 work2");
       //System.out.println(matcher.find());//是否含有
       //System.out.println(matcher.matches());//是否全部匹配
       while(matcher.find()){
        int groupCount=matcher.groupCount();
        System.out.println("groupCount:"+groupCount);
        for (int i = 0; i <= groupCount; i++) {
        System.out.println(matcher.group(i));
        }
       }
}
}
问题1: groupCount输出为3,代表有3个分组。我循环的时候i=1,2,3时对应匹配的3个组"go","to1","work1".
       为什么i=0时,会输出匹配结果"go to1 work2".
问题2: 把 “//System.out.println(matcher.find());//是否含有”  这行的注释去掉,程序的输出结果仅为"true".
       后面的while()循环根本不去执行。为什么?
谢谢各位~~~~~~~~~

解决方案 »

  1.   

    group(0)是输出完整的匹配regex的字符串
    find()执行后,会有一个记录位置的变量停留在找到的这个子串的后面这个位置,所以下一次执行找到的是下一次匹配,而你这个字符串只有一处匹配,那么再去find自然就找不到了,所以返回false
      

  2.   

    1楼说的很确切了。
    你可以把这句换换,看看直观的效果:Matcher matcher=pattern.matcher("Let's go to1 work2, going todo workxxx,");这样第一组find之后,正则匹配的位置记录在work2后面就是逗号那里。然后第二组从逗号往后找,还能找到一组
      

  3.   

    谢谢大家。
    刚才又查了下api,捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.group(0) 等效于 m.group()。 
      

  4.   

    首先明白()元字符的意思,就是代表分组的意思。每个()就是一组。
    group(0)和group()都代表完全匹配的意思。
    group(1)而匹配第一个分组,group(2)则第二个,依次。
    2.find是从字符串的开头匹配的,当你使用了一次find以后,如果匹配成功后,下一次匹配的开始位置应该从
    第一次匹配结束的位置开始。你可以通过matcher.end()获取结束位置。