多语言展示
当前在线:1909今日阅读:84今日分享:32

perl入门:[2]贪婪量词与非贪婪量词

perl中有四个量词:*  .    +   ?这四个量词都是贪婪量词,所谓贪婪,就是尽可能多的匹配字符,稍后会有例子来帮助理解这句话。如果在这些贪婪量词之后,加上“?”号,那么贪婪量词就变成了非贪婪量词,也就是它会尽可能少的匹配字符。下面举几个例子来说明一下。
工具/原料

perl

方法/步骤
1

先看如下代码:$str = 'hi,i am perl!';print $str =~  /i.+p/;该模式先匹配i,当找到i后,因随后的.号可以匹配任意字符,所以,i之后的',i am perl!'都被.+吃掉了,然后开始匹配'p',由于“.”号最后的一个字符是'!'号,所以不匹配,“.”号就把“!”号排除掉,然后“.”代表的最后一个字符就变成了'l',这时也不匹配,然后再排除“l”再用'r'匹配,如此循环下去,直到找到'p'为止(或者找不到指定的模式,直到“.”号把所有的字符都排除掉,则以匹配失败而告终)。这就是贪婪量词的工作方法。

2

再看一下非贪婪量词,还是同一个例子:$str = 'hi,i am perl!';print $str =~  /i.+?p/;以上代码的不同之处在于,“.+”号之后多了“?”号。这行代码的工作顺序是这样的:先匹配“i”,找到'i'后,i之后的第一个字符交给'.+',这时“.+”就表示“,”号,然后再匹配“p”,可是“,”号之后的字符是“i”,不匹配,然后“.+”就把'i'占用了,这时“.+”代表“,i”,然后再匹配,由于后面是空格,还是不匹配,再占用空格,然后再匹配,如此循环,直到字符串结束。

3

通过以上2个例子可以看到,贪婪量词与非贪婪量词的工作顺序是不一样的,凡贪婪量词之后,加上“?”号就可以变成非贪婪量词。论匹配效率,要看具体的情况,如果'.+'吞掉了整篇文章,而实际要匹配的却在句首,还是用非贪婪量词比较好。

推荐信息