Perl regular expression to match an IP address

前端 未结 11 1591
独厮守ぢ
独厮守ぢ 2020-12-11 02:52

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         


        
相关标签:
11条回答
  • 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):

    • (*FAIL): stops pattern matching and fails
    • (?(condition)...): conditional match
    • (?{ code }): used within that condition
    0 讨论(0)
  • 2020-12-11 02:56

    Replace the dashes with commas.

    /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5})/
    
    0 讨论(0)
  • 2020-12-11 03:01

    Change {1-3} to {1,3} same for {1-5} -> {1,5}

    0 讨论(0)
  • 2020-12-11 03:02

    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.

    0 讨论(0)
  • 2020-12-11 03:03

    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
    
    0 讨论(0)
  • 2020-12-11 03:04
    $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 讨论(0)
提交回复
热议问题