Parens的奇数Perl正则表达式行为

时间:2011-05-25 20:35:12

标签: regex perl url matching

我正在提取一些维基百科标记,我想要匹配相对(维基百科)链接中的URL。我不想匹配任何包含冒号(不计算协议冒号)的URL,以避免特殊页面等,所以我有以下代码:

while ($body =~ m|<a href="(?<url>/wiki/[^:"]+)|gis) { 
  my $url = $+{url};
  print "$url\n";
}

不幸的是,这段代码并没有像预期的那样运作。任何包含括号的网址[即/wiki/Eon_(geology)]在开始前的过早被截断,因此该URL将匹配为/wiki/Eon_。我一直在看代码,我无法弄清楚我做错了什么。任何人都可以提供一些见解吗?

2 个答案:

答案 0 :(得分:1)

此代码中没有任何错误,只要您的Perl足够新以支持这些RE功能。用Perl 5.10.1测试。

$body = <<"__ENDHTML__";
<a href="/wiki/Eon_(geology)">Body</a> Blah blah 
<a href="/wiki/Some_other_(parenthesis)">Body</a>
__ENDHTML__

while ($body =~ m|<a href="(?<url>/wiki/[^:"]+)|gis) { 
  my $url = $+{url};
  print "$url\n";
}

你使用旧的Perl吗?

答案 1 :(得分:0)

您没有将RE锚定到字符串的末尾。放一个“事后。

虽然这是一个问题,但这不是他试图解决的问题。他试图解决的问题是RE中的方法/主机名(http://en.wiki ...)没有任何匹配。添加。*?在“(?”

之前会有所帮助