1 概述
量词默认情况下是贪婪的。所谓贪婪的量词会首先匹配整个字符串,如果失败则回退一个字符后重新尝试,这个过程叫回溯。就这样不停的回溯直到找到匹配或者没有字符可尝试位置。形象的说,贪婪的量词首先一次性吃饱,然后一点点吐出来。
懒惰的量词则是采用另外一种策略。它首先从目标的起始位置开始尝试匹配,每次添加一个字符直到找到一个匹配或者尝试了整个字符串为止。形象的说,懒惰的量词是一次吃一点直到吃饱。
2 *、+和?
Kleene星号*:表示匹配的文本连续出现零次或多次,这一命名是为了纪念正则表达式的发明人Stephen Kleene。那么,".*"将匹配任何字符任意次数。
+:匹配文本一次或多次。
?:匹配文本零次或一次
默认情况下的量词是贪婪式的,那么当有一个要匹配的一行文本:"sdfsdf99999999",对于三个正则表达式:9*,9+,9?,匹配结果都是相同的,如下图所示:
不过要注意的是,对于前面两个表达式都是值匹配了一次,而第三个表达式则是连续匹配了6次,因为它每次最多匹配一次。
3 懒惰式匹配
贪婪式匹配的代价较大,而且有时候匹配的结果并不是我们期望的。比如,有一段html文本如下图所示,我们想匹配p1标签中的内容,如果使用正则表达式:<p1>.*</p1>的话,匹配的结果完全不是我们想要的,如下图所示:
这个时候就需要使用懒惰式的匹配了,很简单,只需要加上一个"?"即可,例如将以上的正则表达式改为:<p1>.*?</p1>,就可以匹配到每个p1标签中的内容,如下图所示:
那么,对于上面的例子,用表达式:9??匹配"sdfsdf99999999",将不会有任何匹配结果,因为它会懒惰式的匹配字符'9'零次,如下图所示: