首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

正则有关问题 m.groupCount() 和 m.find()

2013-03-22 
正则问题m.groupCount() 和 m.find()本帖最后由 lpy3654321 于 2012-03-18 02:00:56 编辑import java.util

正则问题 m.groupCount() 和 m.find()
本帖最后由 lpy3654321 于 2012-03-18 02:00:56 编辑


import java.util.regex.*;
public class Sda {
public static void main(String[] args){
String str = "15812345138s15812345678";
Pattern p = Pattern.compile("[1][3,5]+\\d{9}");
Matcher m = p.matcher(str);

if(m.find()){    
            
int count = m.groupCount(); //问题一:此方法为什么回返的是0,而不是1。这是为什么啊??

//下面的for循环只能输入一个手机号,而我想输出两个。。。
            for(int i = 0; i <= count; i++)
                System.out.println("group " + i + " :" + m.group(i)); 
        }  

System.out.println("=======================");


//问题二: 这个while循环能输入第二个,但是第一个确不能输入。 如果单独使用就可以输出两个手机号码。这又是为什么??
while(m.find()){
 System.out.println(m.group()); 
}

}
}



原来的意思是:在一个很长的字符串里很多个手机号码,我想输入第1个,第3个,第5个 ……… 
用上面的while循环需要再加一个自增变量来判断,所以我想用for循环i+=2来做。。找各位大虾帮帮忙。




[解决办法]
你要的效果

        String str = "15812345131s15812345672a15812345133s15812345674a15812345135s15812345676a";
        Pattern p = Pattern.compile("1[358]\\d{9}");
        Matcher m = p.matcher(str);        
        while(m.find()){
            System.out.println(m.group());
            m.find();
       }

[解决办法]
问题一:groupCount指的是一次匹配中捕获组的个数,你的正则中又没有捕获组,当然是0了

问题二:因为前面的if(m.find())已经把第一个匹配结果取到了,你在while(m.find())时,实际上已经是从第二个匹配开始循环了,你把上面的if(m.find())注释掉就能看到了

另外,你写的手机的正则是错的
[解决办法]
引用:
大哥恕我愚昧,我按你的写也不行啊。。。捕获组还是为0。。。


2楼的就已经是你要的效果了,为什么还要纠结于捕获组是不是0呢

这个正则中本来就没有捕获组,你的需求也不关捕获组什么事
[解决办法]
捕获组不是给你用来输出第几个的,呵呵,如果要按你的要求来的话,得这样做,但这样做没有任何意义!

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {

        String str = "15812345131s15812345672a15812345133s15812345674a" +
        "15812345135s15812345676as13312345644";

        String regex = "(1[3458][0-9]{9}).*(1[3458][0-9]{9}).*" +
               "(1[3458][0-9]{9}).*(1[3458][0-9]{9}).*" +


               "(1[3458][0-9]{9}).*(1[3458][0-9]{9}).*" +
               "(1[3458][0-9]{9}).*";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        System.out.println("groupCount: " + matcher.groupCount());
        int count = matcher.groupCount();
        while (matcher.find()) {
            for (int i = 1; i <= count; i++) {
                if (matcher.start(i) > -1) {
                    System.out.println("group " + i + ": " + matcher.group(i));
                }
            }
        }
    }
}




[解决办法]
引用:
上面的写错了 “是第1个,第3个,第5个……”。。


真是无语了,2楼给你的代码,难道就不能自己去输出看下结果吗

String str = "15812345131s15812345672a15812345133s15812345674a15812345135s15812345676a";
Pattern p = Pattern.compile("1[358]\\d{9}");
Matcher m = p.matcher(str);        
while(m.find()){
    System.out.println(m.group());
    m.find();
}
/*-----输出-----
15812345131
15812345133
15812345135
*/

看尾号,这难道不是你要的效果吗

你的需求和捕获没半毛钱关系,为什么非要纠结于groupCount是多少呢

热点排行
Bad Request.