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()循环根本不去执行。为什么?
谢谢各位~~~~~~~~~
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()循环根本不去执行。为什么?
谢谢各位~~~~~~~~~
find()执行后,会有一个记录位置的变量停留在找到的这个子串的后面这个位置,所以下一次执行找到的是下一次匹配,而你这个字符串只有一处匹配,那么再去find自然就找不到了,所以返回false
你可以把这句换换,看看直观的效果:Matcher matcher=pattern.matcher("Let's go to1 work2, going todo workxxx,");这样第一组find之后,正则匹配的位置记录在work2后面就是逗号那里。然后第二组从逗号往后找,还能找到一组
刚才又查了下api,捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.group(0) 等效于 m.group()。
group(0)和group()都代表完全匹配的意思。
group(1)而匹配第一个分组,group(2)则第二个,依次。
2.find是从字符串的开头匹配的,当你使用了一次find以后,如果匹配成功后,下一次匹配的开始位置应该从
第一次匹配结束的位置开始。你可以通过matcher.end()获取结束位置。