正则-贪婪匹配(最大匹配) 和最小匹配的问题。

  • Post author:
  • Post category:其他


贪婪匹配(最大匹配) 和最小匹配的问题。

在抓取链接地址时,使用以下正则时发现,当在<a href=”XXX”>链接标题</a> 链接标题中含有HTML代码时,不能抓取到地址。

/<a[^>]+href=[/”/’]{0,1}([^>/”/’/s]+)[/”/’]{0,1}[^>]*>([^>]+)<//a>/i

尚若换成以下方式

/<a[^>]+href=[/”/’]{0,1}([^>/”/’/s]+)[/”/’]{0,1}[^>]*>(。+)<//a>/i

则不能抓取到你需要的链接数据,默认情况下,perl使用的是贪婪匹配模式,也就是尽可能多的匹配数据。

如:下面的脚本打印出“matched defgabcdef”,因为它尽可能多地匹配模式,直至结尾的‘g’。

$data = ‘abcdefgabcdefg’;

$data =~ /abc(.+)g/i;

print “matched “;

要改变匹配特点,只须简单地在量词(加号[+]或星号[*])后面加一个问号(?)即可。在上面的程序中把模式改为在‘+’之后包含一个‘?’。

$data =~ /abc(.+?)g/i;

输出变成“matched def”,因为模式不再贪婪,而在允许模式匹配的同时匹配最少数目的字符。

对于可能得到的匹配多于期望的匹配的情况,最小匹配是必要的。

改成以下正则:

/<a[^>]+href=[/”/’]{0,1}([^>/”/’/s]+)[/”/’]{0,1}[^>]*>(.+?)<//a>/i

则可以抓取到需要的链接.

文章来源地址为:

http://www.lampba.com/home-space-uid-4-do-blog-id-22.html



版权声明:本文为fafa211原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。