Вопрос по ip, perl, regex – Регулярное выражение Perl для соответствия IP-адресу
Я написал этот код, но он не работает. Может кто-то указать на проблему?
<code>sub match_ip() { my $ip = "The IP address is 216.108.225.236:60099"; if($ip =~ /(\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}\:\d{1-5})/) { print "$1\n"; } } </code>
РЕДАКТИРОВАТЬ: Я хотел просто извлечь IP-адрес, а не делать какие-либо проверки.
{1-3}
в{1,3}
то же самое для{1-5}
->{1,5}
Кроме того, вы можете использоватьData::Validate::IP
с предупреждением, что он не распознает порт, поэтому вам придетсяsplit
на:
.
use strict;
use warnings;
use Data::Validate::IP;
my $ip_with_port="216.108.225.236:60099";
my $ip=(split /:/,$ip_with_port)[0];
my $validator=Data::Validate::IP->new;
if($validator->is_ipv4($ip))
{
print "Yep, $ip is a valid IPv4 address.\n";
}
else
{
print "Nope, $ip is not a valid IPv4 address.\n";
}
Вывод:
Yep, 216.108.225.236 is a valid IPv4 address.
#!/usr/bin/perl
$str = 'IP address is : 70.21.311.105';
if ($str =~ m/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/) {
if ($1 <= 255 && $2 <= 255 && $3 <= 255 && $4 <= 255 ) {
print "Valid $str\n";
} else {
print "invalid IP $str\n";
}
}
__END__
if condition
, который может быть написан с первым, как этотif($str =~ m/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/ && ($1<=255 && $2<=255 && $3<=255 && $4<=255 ))
serenesat
и для сопоставления и проверки IP-адресов, но должна быть веская причина, по которой вы не должны их использовать. Лично у меня никогда не было реальной причины использовать их для проверки, так как я доверял / подавал ввод.
Вот более короткая версия вашего регулярного выражения, со своими собственными подводными камнями:
while (my $ip = <DATA>) {
chomp $ip;
# older version
# if($ip =~ /(\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}\:\d{1-5})/)
# see below for explanation
if ($ip =~ /\b(\d{1,3}(?:\.\d{1,3}){3}:\d{1,5})\b/)
{
print "$ip - matches\n";
} else {
print "$ip - does not match\n";
}
}
__DATA__
216.108.225.236:60099
4.2.2.1:1
216.108.225.236:0
1216.1108.1225.1236:1234
216.108.225.236x:123
9216.108.225.236:8472
10.10.10.10
Полученные результаты
216.108.225.236:60099 - matches
4.2.2.1:1 - matches
216.108.225.236:0 - matches
1216.1108.1225.1236:1234 - does not match
216.108.225.236x:123 - does not match
9216.108.225.236:8472 - does not match
10.10.10.10 - does not match
Explanation:
/\b # word boundary
( # start memory capture group 1
\d{1,3} # one to three digits, first octat
(:? # start non memory capture group, notice ?:
\.\d{1,3} # a literal dot followed by an ip octet
) # end non memory capture group
{3} # three times of dots and ip octets
: # match a colon
\d{1,5} # port number, one to five digits
) # end of memory capture group 1
\b # word boundary
Надеюсь это поможет
333.108.225.236:123
неверный IP-адрес, но прошел бы проверку.
Will Sheppard
Попробуй это
$variablename=~m/((((0-9)|((1-9)(0-9))|(1([0-9]){2})|(2[0-4][0-9])|(2[5][0-5]))\.){3})((0-9)|((1-9)(0-9))|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))/)
http: //metacpan.org/pod/Regexp :: Общие :: Чистая
Если вы извлекаете IP-адрес, который не является IP-адресом ... вы не извлекаете правильную вещь.
use strict;
use warnings;
open(FH,"<fileName.txt") or die "file not found ,$_";
while(my $line=<FH>)
{
push(my @arr,($line));
foreach my $arrVal (@arr)
{
if($arrVal=~/IPv4 Address(?=.*\b((25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2 [0-4]\d|[0-1]?\d?\d)){3})\b)/)
{
print "$arrVal\n";
}
}
Это может помочь:
my $ip = "195.249.61.14";
my @ips = (
"set protocols bgp group IBGP-RRCL-CUSTOMER neighbor 195.249.61.142",
"set protocols bgp group IBGP-RRCL-CUSTOMER neighbor 195.249.61.14",
"set protocols bgp group IBGP-RRCL-CUSTOMER neighbor 195.249.61.141"
);
foreach (@ips) {
print "$_\n" if ( /\b$ip\b/ );
}
Выход
set protocols bgp group IBGP-RRCL-CUSTOMER neighbor 195.249.61.14
чтобы убедиться, что квад не больше 255, он также «повторно» использует сопоставление цифр вместо копирования их 4 раза.
my $rx = qr/^(?!(\.))(\.?(\d{1,3})(?(?{$^N > 255})(*FAIL))){4}$/;
if('192.168.1.2' =~ $rx){
print "OK\n";
}
Он использует несколько функций из сопоставления регулярных выражений perl (man perlre):
(* FAIL): останавливает сопоставление с образцом и завершается ошибкой (? (условие) ...): условное совпадение (? {code}): используется в этом условии$ip = "10.255.256.1";
# will accept valid ips
if ($ip =~ m/^([1|2][0-9]{1,2})\.([0-255]{1,3}\.){2}[0-255]{1,3}/ && ($1 <=255)) {
print "This is a valid ip: $ip \n";
} else {
print "This is not a valid ip: $ip \n";
}
[0-255]
в регулярном выражении не делает то, что вы думаете, что делать.
tripleee