黑马程序员技术交流社区
标题:
关于正则表达式中数量词的疑问,Greedy数量词和Reluctant数...
[打印本页]
作者:
hoyouly
时间:
2013-10-13 21:45
标题:
关于正则表达式中数量词的疑问,Greedy数量词和Reluctant数...
本帖最后由 杨增坤 于 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的区别是什么呢??怎么理解贪婪性数量词和勉强性数量词呢,懂的麻烦举个例子说明一下,谢谢、
作者:
简单ai...
时间:
2013-10-17 13:03
,这个知识我也不知道,不过我查了查,现学现卖了,原因是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字符,如果.*?意味着没有匹配任何字符。
作者:
李江
时间:
2013-10-18 19:48
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:
http://bbs.itheima.com/thread-89313-1-1.html
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2