Perl正则表达式匹配IP地址

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地址,不进行任何验证。


8
不要自己编写正则表达式,你可以考虑使用一个经过充分文档化和测试的模块,例如Regexp::Common - dgw
3
这里有不止几个问题。使用其中一个模块,或查看所有模块所做的事情以正确地完成它 :) - brian d foy
1
你是想验证还是仅提取IP地址?因为它在前者方面的工作非常糟糕。 - ikegami
我只想提取,不验证。 - cppcoder
2
你也不想提取那些不能成为IP地址的东西,因此进行验证非常容易,有助于减少误报。 - brian d foy
事实上,仅仅为了验证,我不想让我的脚本依赖于任何模块。我期望在我处理的文件中只有有效的IP地址。 - cppcoder
12个回答

-1
您还可以使用以下正则表达式来确保四元组不大于255,它还可以“重复使用”数字匹配,而不是将其复制4次。
my $rx = qr/^(?!(\.))(\.?(\d{1,3})(?(?{$^N > 255})(*FAIL))){4}$/;
if('192.168.1.2' =~ $rx){
  print "OK\n";
}

它使用了一些来自perl正则表达式匹配的特性(参见perlre手册):

  • (*FAIL):停止模式匹配并失败
  • (?(condition)...): 条件匹配
  • (?{ code }):在该条件中使用

这对于 $rx = "27.34" 失败了。 - Jim True

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

你正在重新发明轮子,而且做得很糟糕。首先,这不允许任何第一个八位字节值大于等于200的地址。 - tripleee
我认为你应该学习一下IP地址。C类地址不会大于等于200.通常我们只检查C类地址。如果你想检查其他类的地址,请告诉我。 - user2662353
类C网络与任何事情有什么关系?在现代世界中,网络已经是无类的了。而OP的示例地址是216.x.x.x。在正则表达式中,[0-255]根本不会做你认为它应该做的事情。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接