Perl regular expression to match IP address

I wrote this code, but it does not work. Can someone point out a problem?

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: I just wanted to extract the IP address and not perform any checks.

+8
regex perl ip
source share
12 answers

Change {1-3} to {1,3} the same for {1-5} β†’ {1,5}

+10
source share

In the spirit of TIMTOWTDI, there is one more thing here: Regexp::Common::net part of Regexp::Common may have the regular expression that you want.

+5
source share

Alternatively, you can use Data::Validate::IP with the caution that it does not recognize the port, so you will need to split into :

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

Output:

 Yep, 216.108.225.236 is a valid IPv4 address. 
+3
source share

Replace the dash with commas.

 /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5})/ 
+2
source share

Although CPAN has well-documented and tested modules for mapping and checking IP addresses, there should be no good reason for you. Personally, I never had a real reason to use them for verification purposes, since I trusted / served the input.

Here is a shorter version of your regexp with your own traps:

 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 

Results:

 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 

Hope this helps.

+2
source share

This can help:

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

Output:

 set protocols bgp group IBGP-RRCL-CUSTOMER neighbor 195.249.61.14 
+1
source share

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

If you retrieve an IP address that is not an IP address, you are not retrieving the right things.

0
source share
 #!/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
source share

Try the following:

 $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
source share
 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
source share

You can also use the following regular expression to make sure that the square is no more than 255, it also β€œrepeats” the comparison of digits instead of copying it 4 times.

 my $rx = qr/^(?!(\.))(\.?(\d{1,3})(?(?{$^N > 255})(*FAIL))){4}$/; if('192.168.1.2' =~ $rx){ print "OK\n"; } 

It uses several functions from the perl regex matching (man perlre):

  • (* FAIL): stops matching pattern and does not work
  • (? (condition) ...): conditional match
  • (? {code}): used in this state
-one
source share
 $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"; } 
-2
source share

All Articles