I have written this code, but it does not work. Can someone point out the issue?
sub match_ip()
{
my $ip = \"The IP address is 216.108.225.236:60099\";
i
You can also use the following regex to make sure that the quad's aren't bigger then 255, it also "reuses" the digit matching instead of copypasting it 4 times.
my $rx = qr/^(?!(\.))(\.?(\d{1,3})(?(?{$^N > 255})(*FAIL))){4}$/;
if('192.168.1.2' =~ $rx){
print "OK\n";
}
It uses a few features from perl regex matching (man perlre):
Replace the dashes with commas.
/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5})/
Change {1-3}
to {1,3}
same for {1-5}
-> {1,5}
Though there are well documented and tested modules at CPAN to match and validate IP addresses but there must be some solid reason for you not to use it. Personally I never had a real reason to use them for validation purpose either since I trusted/feeded the input.
Here is a shorter version of your regex, with it's own pitfalls:
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.
This might 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
$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";
}