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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨增坤 于 2013-10-18 20:06 编辑

数量词可以分为Greedy性,Reluctant性,Possessive性,即贪婪性,勉强性,占有性
勉强性:匹配最小的重复次数
占有性:即使让整个匹配失败,也要匹配最大的重复数。
贪婪性:能够使匹配成功的最大可能重复数
贪婪性和占有性这个我还能理解:
String str="ckab";
                String regex1="[a-z]*ab";//Greedy数量词
                String regex2="[a-z]*?ab";//Reluctant数量词
                String regex3="[a-z]*+";// Possessive数量词
                String regex4="[a-z]*+ab";
               
                System.out.println("[a-z]*ab: "+str.matches(regex1));//true,匹配了两次
                System.out.println("[a-z]*?ab: "+str.matches(regex2));//true,匹配了两次
                System.out.println("[a-z]*+: "+str.matches(regex3));//true,匹配了四次
                System.out.println("[a-z]*+ab: "+str.matches(regex4));//false,匹配了四次

虽然regex3 和rege4都是使用的占有性数量词,也是匹配了四次,可是结果却不一样,那是因为对于占有性数量词来说,会把ckab整个字符于[a-z]*+进行匹配。匹配成功,所以regex3是true,而regex4后面还有ab,故匹配不成功,
现在的问题是,regex1和regex2的区别是什么呢??怎么理解贪婪性数量词和勉强性数量词呢,懂的麻烦举个例子说明一下,谢谢、

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

2 个回复

倒序浏览
,这个知识我也不知道,不过我查了查,现学现卖了,原因是Possessive数量词是不回溯的,而Greedy可回溯。
[a-z]*匹配了全部的str,后面加上任何东西都不再是str了,所以结果为false。下面是我学习的时候看的,


我们平时经常使用的正则表达式默认情况下基本都是Greedy模式,也就是贪吃模式,java中看下表
Greedy 数量词
X?        X,一次或一次也没有
X*        X,零次或多次
X+        X,一次或多次
X{n}        X,恰好 n 次
X{n,}        X,至少 n 次
X{n,m}        X,至少 n 次,但是不超过 m 次
也就是说对于 abcd123这个原始文本来说 .*3 是可以匹配的,因为点可以匹配任何字符,*表示可以匹配0次或者多次,全部吃入abcd123发现.*匹配了,但是后面有个3却无法匹配,因此就回溯一个字符,也就是.*只匹配abcd12 刚好整个表达式可以匹配。这就是贪吃,可以回溯。
与Greedy相类似的还有一个Possessive
Possessive 数量词
X?+        X,一次或一次也没有
X*+        X,零次或多次
X++        X,一次或多次
X{n}+        X,恰好 n 次
X{n,}+        X,至少 n 次
X{n,m}+        X,至少 n 次,但是不超过 m 次
它和greedy类似,也是全部吃入,但是唯一不同的是它不回溯,所以对于上面的abcd123这个例子,.*+3是不匹配的。

对于Reluctant 来说,就是Greedy的一个相反的匹配模式,他从左到有一个一个开始匹配,而不是整个字符串一个一个回溯。
Reluctant 数量词
X??        X,一次或一次也没有
X*?        X,零次或多次
X+?        X,一次或多次
X{n}?        X,恰好 n 次
X{n,}?        X,至少 n 次
X{n,m}?        X,至少 n 次,但是不超过 m 次
同样对于上面这个例子,abcd123,  用.*?3 也是匹配的,因为从左到右,一个一个看只有全部才能匹配,而对于 模式.+?来说,只匹配最左边的a字符,如果.*?意味着没有匹配任何字符。

评分

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

查看全部评分

回复 使用道具 举报

楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马