Perl贪婪匹配、非贪婪匹配、占有优先匹配的區別和應用
在基础正则中,那些能匹配多次的量词都会匹配最长内容。这种尽量多匹配的行为称为"贪婪匹配"(greedy match)。
例如字符串"aa1122ccbb",用正则表达式a.*c去匹配这个字符串,其中的.*将直接从第二个字母a开始匹配到最结尾的b,因为从第二个字母a开始到最后一个字母b都符合.*的匹配模式。再然后,去匹配字母c,但因为已经把所有字母匹配完了,只能回退一个字母一个字母地释放,每释放一个就匹配一次字母c,发现回退释放到倒数第三个字母就能满足匹配要求,于是这里的.*最终匹配的内容是"a1122cc"。
上面涉及到回溯的概念,也就是将那些已经被量词匹配的内容回退释放。
上面描述的是贪婪匹配行为,还有非贪婪匹配、占有优先匹配,以下简单描述下他们的意义:
- 非贪婪匹配:(lazy match,reluctant)尽可能少地匹配,也叫做懒惰匹配
- 占有优先匹配:(possessive)占有优先和固化分组是相同的,只要占有了就不再交换,不允许进行回溯。相关内容见后文"固化分组"
有必要搞清楚这几种匹配模式在匹配机制上的区别:
- 贪婪匹配:对于那些量词,将一次性从左到右匹配到最大长度,然后再往回回溯释放。
- 非贪婪匹配:对于那些量词,将从左向右逐字符匹配最短长度,然后直接结束这次的量词匹配行为。
- 占有优先匹配:按照贪婪模式匹配,匹配后内容就锁住,不进行回溯(后文固化分组有具体示例)

- 從下面的例子可以理解貪婪和非貪婪匹配的行為
$str="abc123abc1234"; # greedy match if( $str =~ /(a\w*3)/){ print "$&\n"; # abc123abc123 } # lazy match if( $str =~ /(a\w*?3)/){ print "$&\n"; # abc123 }
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/37579.html