dax*_*xim 2 regex perl regex-greedy
这是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;
Run Code Online (Sandbox Code Playgroud)
第二场比赛失败了.use re 'debugcolor'显示:($port_re)已经:5在IPv6地址内匹配.这让我感到惊讶,因为我没有关闭贪婪?.我期待它吞噬所有的东西],然后匹配分离的冒号和之后的内容.
为什么会这样,有什么补救措施?
只有当你的一个原子可以选择匹配多少(即使用,或者)时*,贪婪才会发挥作用.这不是贪婪问题.+?{n,m}
问题是正则表达式只会匹配一个IPv6地址,如果它后面紧跟着" ]"和" :".这不可能发生.
您可以使用两种不同的匹配,也可以使用以下内容:
my $port_re = list2re 0..65535;
my $IPv4_re = $RE{net}{IPv4};
sub ip_port_from_netloc {
my ($sentence) = @_;
return if $sentence !~ /
(?: \[ ( $IPv6_re ) \]
| ( $IPv4_re )
)
: ($port_re)
/msx;
return ($1 // $2, $3);
}
Run Code Online (Sandbox Code Playgroud)
也许这有点清洁?
my $port_re = list2re 0..65535;
my $IPv4_re = $RE{net}{IPv4};
sub ip_port_from_netloc {
my ($sentence) = @_;
return if $sentence !~ /
(?: \[ (?<addr> $IPv6_re ) \]
| (?<addr> $IPv4_re )
)
: (?<port> $port_re )
/msx;
return ( $+{addr}, $+{port} );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |