【发布时间】:2012-04-27 05:22:18
【问题描述】:
这是Perl regular expression to match an IP address 的后续报道。我想展示如何正确解决问题,但遇到了意想不到的行为。
use 5.010;
use strictures;
use Data::Munge qw(list2re);
use Regexp::IPv6 qw($IPv6_re);
use Regexp::Common qw(net);
our $port_re = list2re 0..65535;
sub ip_port_from_netloc {
my ($sentence) = @_;
return $sentence =~ /
( # capture either
(?<= \[ )
$IPv6_re # IPv6 address without brackets
(?= \] )
| # or
$RE{net}{IPv4} # IPv4 address
)
: # colon sep. host from port
($port_re) # capture port
/msx;
}
my ($ip, $port);
($ip, $port) = ip_port_from_netloc 'The netloc is 216.108.225.236:60099';
say $ip;
($ip, $port) = ip_port_from_netloc 'The netloc is [fe80::226:5eff:fe1e:dfbe]:60099';
say $ip;
第二次匹配失败。 use re 'debugcolor' 表明 :($port_re) 已经与 IPv6 地址中的 :5 匹配。这让我感到惊讶,因为我没有用? 关闭贪婪。我预计它会吞噬所有内容,直到],然后才匹配分隔冒号以及之后的内容。
为什么会发生这种情况,有什么补救措施?
【问题讨论】:
标签: regex perl regex-greedy