Perl regular expression to match an IP address

前端 未结 11 1734
独厮守ぢ
独厮守ぢ 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条回答
  •  眼角桃花
    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 = )  {
        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.

提交回复
热议问题