A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 t_mac 于 2011-12-2 22:58 编辑

public static void getDemo(){
                String str = "ming tian jiu yao fang jia le, da jia";
                String  regex = "\\b[a-z]{3}\\b";
                Pattern p =  Pattern.compile(regex);
                Matcher m = p.matcher(str);
               
                while(m.find()){
                        System.out.println(m.group());
                }
在上例中为什么不能用match()方法代替find()方法?两个方法不都是去逐一匹配吗,它们返回的都是布尔类型的值,应该可以循环才对。谢谢

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

3 个回复

正序浏览

关于Matcher类
matches() 和find() 是两个不同的匹配的方式:
1、matches() 是将整个String字符串匹配(循环没任何意义,因为就匹配一次)
2、find() 是按照顺序匹配逐一的查找 (可以循环往下查找)

可以看下JDK帮助文档:
  matches() :Attempts to match the entire region against the pattern.
   find():Attempts to find the next subsequence of the input sequence that matches the pattern.

具体内部的算法看下Matcher类的原代码。

String类的matches()其实也是调用Matcher类matches() 方法。
在实际的应用如果直接匹配整个字符串我们一般直接使用String类的matches() 比较方便。(例如Email、用户名的验证)
find() 的方法处理过滤的字符串,替换字符串等等。(例如论坛发表帖子过滤敏感字符)

评分

参与人数 1技术分 +2 收起 理由
admin + 2 赞一个!

查看全部评分

回复 使用道具 举报
那个方法应该是matches()吧,matches()是尝试将整个区域与模式匹配,当且仅当整个区域序列匹配此匹配器的模式时才返回 true,你这个代码会返回false,以下的循环就不会执行了,而find()方法是尝试查找与该模式匹配的输入序列的下一个子序列,当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true,匹配成功,则可以用group()方法返回

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
m.match()是将整个区域与模式匹配;m.find()是尝试查找与该模式匹配的输入序列的下一个子序列;
用m.match()返回的是false,while循环根本就不能执行;而m.find()是查找str的子序列,找到满足条件的就返回true,并将
满足条件的子序列用m.group()返回。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马