一、概念
贪婪模式: 先看整个的字符串是否匹配,如果没有发现匹配,它去掉该字符串中的最后一个字符,并再次尝试,如果还是没有,那么再次去掉最后一个字符,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。
懒惰模式:先看字符串中的第一个字符是否匹配,如果单独这一个字符还不够,就读入下一个字符,组成两个字符的字符串,如果还是没有发现匹配,继续从字符串中添加字符,直到发现匹配 或者整个字符串都检查过也没有匹配。(与贪婪模式正好相反)
支配模式:只尝试匹配整个字符串,如果整个字符串不能产生匹配,不做进一步尝试。
二、列表
贪婪
懒惰
支配
描述
?
??
?+
零次或一次出现
*
*?
*+
零次或多次出现
+
+?
++
一次或多次出现
{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(第四到第五个字符)。