12

我已经编写了这段代码,但它不起作用。有人可以指出这个问题吗?

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

编辑:我只想提取 IP 地址,不做任何验证。

4

11 回答 11

15

更改{1-3}{1,3}相同{1-5}->{1,5}

于 2012-04-15T12:22:03.350 回答
7

本着 TIMTOWTDI 的精神,这里是另一个: 的Regexp::Common::net部分Regexp::Common可能有你想要的正则表达式。

于 2012-04-16T01:53:34.417 回答
3

或者,您可以使用Data::Validate::IP, 并注意它无法识别端口,因此您必须spliton :

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

输出是:

Yep, 216.108.225.236 is a valid IPv4 address.
于 2012-04-15T14:12:38.810 回答
2

用逗号替换破折号。

/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5})/
于 2012-04-15T12:23:29.670 回答
2

虽然在 CPAN 有很好的文档和测试模块来匹配和验证 IP 地址,但你必须有充分的理由不使用它。就我个人而言,我从来没有真正的理由将它们用于验证目的,因为我信任/提供了输入。

这是您的正则表达式的较短版本,它有自己的缺陷:

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

结果:

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

解释:

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

希望这可以帮助。

于 2012-04-16T20:43:28.090 回答
1

这可能会有所帮助:

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

输出:

set protocols bgp group IBGP-RRCL-CUSTOMER neighbor 195.249.61.14
于 2013-11-26T11:15:01.537 回答
1
#!/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__
于 2014-09-20T11:50:35.307 回答
0

试试这个:

$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]))/)
于 2015-05-15T11:55:28.543 回答
0
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";
}
}
于 2016-05-02T09:09:44.847 回答
-1

您还可以使用以下正则表达式来确保四边形不大于 255,它还“重用”数字匹配而不是复制粘贴 4 次。

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

它使用了 perl 正则表达式匹配(man perlre)的一些特性:

  • (*FAIL):停止模式匹配并失败
  • (?(condition)...):条件匹配
  • (?{ code }):在该条件下使用
于 2014-01-13T22:24:27.200 回答
-2
$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";
}
于 2013-08-13T05:45:45.010 回答