一、概念

       贪婪模式: 先看整个的字符串是否匹配,如果没有发现匹配,它去掉该字符串中的最后一个字符,并再次尝试,如果还是没有,那么再次去掉最后一个字符,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。

       懒惰模式:先看字符串中的第一个字符是否匹配,如果单独这一个字符还不够,就读入下一个字符,组成两个字符的字符串,如果还是没有发现匹配,继续从字符串中添加字符,直到发现匹配 或者整个字符串都检查过也没有匹配。(与贪婪模式正好相反)

       支配模式:只尝试匹配整个字符串,如果整个字符串不能产生匹配,不做进一步尝试。

二、列表

 

贪婪

懒惰

支配

描述

?

??

?+

零次或一次出现

*

*?

*+

零次或多次出现

+

+?

++

一次或多次出现

{n}

{n}?

{n}+

恰好N次出现

{n,m}

{n,m}?

{n,m}+

至少N次至多M次出现

{n,}

{n,}?

{n,}+

至少N次出现

 

三、举例

       当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

       有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版an的例子吧:

       a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。