这是Perl 正则表达式匹配 IP 地址的后续内容。我想展示如何正确解决问题,但遇到了意想不到的行为。
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'
显示在 IPv6 地址中:($port_re)
已经匹配。:5
这让我感到惊讶,因为我没有用?
. 我希望它会吞噬所有内容,直到]
,然后才匹配分隔冒号以及之后的内容。
为什么会发生这种情况,补救措施是什么?