黑马程序员技术交流社区

标题: 正则中进行字符串子串获取时find()方法与match()方法 [打印本页]

作者: t_mac    时间: 2011-12-2 09:54
标题: 正则中进行字符串子串获取时find()方法与match()方法
本帖最后由 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()方法?两个方法不都是去逐一匹配吗,它们返回的都是布尔类型的值,应该可以循环才对。谢谢
作者: 喻尚健    时间: 2011-12-2 10:21
m.match()是将整个区域与模式匹配;m.find()是尝试查找与该模式匹配的输入序列的下一个子序列;
用m.match()返回的是false,while循环根本就不能执行;而m.find()是查找str的子序列,找到满足条件的就返回true,并将
满足条件的子序列用m.group()返回。
作者: 颜秉武    时间: 2011-12-2 10:33
那个方法应该是matches()吧,matches()是尝试将整个区域与模式匹配,当且仅当整个区域序列匹配此匹配器的模式时才返回 true,你这个代码会返回false,以下的循环就不会执行了,而find()方法是尝试查找与该模式匹配的输入序列的下一个子序列,当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true,匹配成功,则可以用group()方法返回
作者: 刘海涛    时间: 2011-12-2 11:53

关于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() 的方法处理过滤的字符串,替换字符串等等。(例如论坛发表帖子过滤敏感字符)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2