Perl正则表达式禁用括号提取

时间:2012-10-29 00:30:43

标签: regex perl extract

我正在尝试在another answer找到的东西,但我遇到了一些问题:

我知道URL有更好的正则表达式,但请考虑这个例子:

@links=($content =~ m/(https?)?.*[.]com/g);
*$content has text or html

部分(https?)?适用于www.google.com之类的链接,但是使用括号将"http"返回$1,并将其放入@links!这是一个问题,因为我想要整个链接。

从文本中全局提取简单链接(或指定的正则表达式)并将它们放入列表中的内容是什么?
简单来说,我的意思是:

  • http://www.google.com
  • www.google.com
  • google.com
  • https://www.google.com

2 个答案:

答案 0 :(得分:5)

您的方法太天真,它不会捕获许多其他网址。 相反,使用Regexp :: Common,如下所示:

use Regexp::Common qw/URI/;

my @links = ($content =~ /$RE{URI}/g);

这适用于HTTP,HTTPS,FTP等,并正确捕获URL参数的更高级组合。

答案 1 :(得分:3)

非捕获版本如下所示:

m/(?:https?)?.*[.]com/g

为了捕获链接,我使用这个从URI :: Find:

派生的正则表达式
m<https?://[;/\?:\@&=+\$,\[\]A-Za-z0-9\-_.!~*'()%#]*[/\?:\@&=+\$\[A-Za-z0-9\-_!~*(%#]>