如何使用Perl正则表达式从纯文本中提取具有特定扩展名的特定域(可能具有可变子域)的所有URL?我试过了:

my $stuff = 'omg http://fail-o-tron.com/bleh omg omg omg omg omg http://homepage.com/woot.gif dfgdfg http://shomepage.com/woot.gif aaa';
while($stuff =~ m/(http\:\/\/.*?homepage.com\/.*?\.gif)/gmsi)
{
print $1."\n";
}

它可怕地失败了,并给了我:
http://fail-o-tron.com/bleh omg omg omg omg omg http://homepage.com/woot.gif
http://shomepage.com/woot.gif

我以为不会发生这种情况,因为我正在使用.*?,它应该是非贪婪的,并且给我最小的匹配。谁能告诉我我在做什么错? (我不想使用任何 super 复杂的 jar 装正则表达式来验证URL;我想知道我做错了什么,所以我可以从中学习。)

最佳答案

URI::Find是专门为解决此问题而设计的。它将找到所有URI,然后您可以对其进行过滤。它具有一些启发式方法来处理诸如尾随标点符号之类的问题。

更新:最近更新为处理Unicode。

10-04 18:47