Java正则中的Greedy、Reluctant 、Possessive qualifier

来源:互联网 发布:webshell密码暴力破解 编辑:程序博客网 时间:2024/05/30 05:17

我们平时经常使用的正则表达式默认情况下基本都是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字符,如果.*?意味着没有匹配任何字符。


原文:
http://blog.csdn.net/lovingprince/article/details/8813501
http://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fcomp.faq%2FVIM%2Fusage%2Fregexp%2FM.1180953641.00

0 0