默认情况下,所有量词都是贪心(greddy)的:就是说会尽可能多地匹配。而懒惰就刚刚相反。但是,可以通过在量词后面添加一个“?”,那么新组合成的量词将使懒惰的。
比如说,量词“*”是贪心的,但是量词组合“*?”却是懒惰的。
效用上他们的区别在于:惰性的量词"*",每次只会前进一个字符,并且每次都会检查是否匹配下一个标记。
举个经典的例子,说一下吧:
regex_1:<a>.*?</a> 与regex_2:<a>.*</a>
test文本:
<a>who r u?</a><a>I am Kaiwii</a>
regex_1匹配的内容为:
regex_2匹配的内容为:
分析:
两个regex的共同部分在于:“.*”。“.”匹配单个字符,而量词“*”就表示前面的部分-“.”可以出现任意多次,既可以匹配任意长的内容。
两个regex的区别在于:最后有否量词“?”。
因为,量词“?”是懒惰的。所谓的懒惰就是说,在识别过程中,每次用“.*”向前推进一个字符匹配新的内容的时候,就马上使用懒惰量词“?”后面的字符“<”匹配下一位的内容,如果成功的话,就继续使用“<”之后的字符"/"来识别;如果不成功就反过来使用“.*?”来匹配新的内容。就好像,时刻有一个哨兵指针指向下一位,并尝试匹配下一位的字符!!!!
而,如果没有“?”就变成“.*”。量词“*”是贪心的,只要它开始,就会一条黑路走到尾。最后才用它后一个字符“<”进行识别。很明显这样做是徒然的。必然需要不断回溯(吐出“.*”已经匹配的内容),来用"<"识别直到可以完全使用“</a>”才结束。所以易见得不到第一个"</a>",就已经结束回溯了!