贪心与懒惰量词重复操作问题

默认情况下,所有量词都是贪心(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>",就已经结束回溯了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值