我使用此代码来匹配IP
$IP =~ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/;
if ( $1 < 256 && $2 < 256 && $3 < 256 && $4 < 256) {
print "IP matched";
}
我不想使用if循环。有没有办法可以在regexp中进行检查(&lt; 256)
我知道还有另一种方式,如
/25[0-5]|2[0-4][0-9]|[01][0-9][0-9]?/
还有另一种快捷方式
答案 0 :(得分:9)
use Regexp::Common 'net';
if ( $IP =~ /\A$RE{net}{IPv4}\z/ ) {
print "IP matched\n";
}
答案 1 :(得分:2)
查看@ysth的答案,或者你可以将匹配存储到数组中:
my @m = grep $_ <256, $IP =~ /([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/;
if (@m == 4) {
print "IP matched";
}
答案 2 :(得分:1)
这不是很漂亮,但是怎么样
/^(1?\d{1,2}|2[0-4]\d|25[0-5])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){3}$/
答案 3 :(得分:1)
我能理解你在询问有关验证IP地址的正则表达式吗?但为什么不尝试http://metacpan.org/pod/Data::Validate::IP而不是手动方法?
答案 4 :(得分:0)
嵌入式代码可以用作正则表达式中的条件,并且可以使某些分支强制回溯:
qr/
# the string consists of nothing but 4 bytes separated by a period
\A (?&decimal_byte) (?: [.] (?&decimal_byte) ){3} \z
(?(DEFINE)
(?<decimal_byte>
([0-9]{1,3}+) # 1 to 3 digits without backtracking
(?(?{ $^N <= 0xFF }) | (*FAIL) ) # (?(?{ COND }) YES | NO )
)
)
/x
$^N
是指last closed capture group。请注意,评估正则表达式中的代码具有安全性影响 1 ,并且此技术无法移植到其他正则表达式引擎(如pcre)。
如果您盲目地插入不受信任的正则表达式,它可以执行任意代码:
my $malicious = '(?{ `rm -rf ~` })';
say "You were pwned" if $foo =~ /something="$malicious"/;
如果你想自己负责正则表达式安全,Perl会要求你use re qw/eval/
,从而使你免于正则表达式安全地狱。请注意,只有在插值触发新编译时才需要这样做:my $ok = qr/(?{ say "yes" })/; $foo =~ /$ok/
工作正常。