web-dev-qa-db-fra.com

Expression régulière Perl pour correspondre à une adresse IP

J'ai écrit ce code, mais cela ne fonctionne pas. Quelqu'un peut-il signaler le problème?

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";
  }
}

EDIT: Je voulais simplement extraire l'adresse IP, sans aucune validation.

10
cppcoder

Remplacez {1-3} par {1,3} idem pour {1-5} -> {1,5}

11
Toto

Dans l’esprit de TIMTOWTDI, en voici un autre: le Regexp::Common::net portion de Regexp::Common peut avoir une expression régulière que vous désirez.

5
Joel Berger

Alternativement, vous pouvez utiliser Data::Validate::IP , avec l’avertissement que le port ne sera pas reconnu. Vous devrez donc split sur :.

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";
}

La sortie est:

Yep, 216.108.225.236 is a valid IPv4 address.
3
user554546

Bien que CPAN dispose de modules bien documentés et testés pour faire correspondre les adresses IP et les valider, il doit exister une raison sérieuse pour ne pas les utiliser. Personnellement, je n'ai jamais vraiment eu de raison de les utiliser à des fins de validation, car j'ai fait confiance aux commentaires.

Voici une version plus courte de votre regex, avec ses propres pièges:

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

Résultats:

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

Explication:

/\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

J'espère que cela t'aides.

2
Ashish Kumar

Remplacez les tirets par des virgules.

/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5})/
2
jsf80238

Cela pourrait aider:

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/ );
}

Sortie:

set protocols bgp group IBGP-RRCL-CUSTOMER neighbor 195.249.61.14
1
Tomas Jensen

http://metacpan.org/pod/Regexp::Common::net

Si vous extrayez une adresse IP qui n'est pas une adresse IP ... vous n'extrayez pas la bonne chose.

0
user1989484
#!/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__
0
Kumud Raj
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";
}
}
0
Devendra

Essaye ça: 

$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]))/)
0
Perlgrammer