我可以使用啥正则表达式来匹配以点十进制表示法表示的任何有效 IP 地址?
Posted
技术标签:
【中文标题】我可以使用啥正则表达式来匹配以点十进制表示法表示的任何有效 IP 地址?【英文标题】:What regex can I use to match any valid IP-address represented in dot-decimal notation?我可以使用什么正则表达式来匹配以点十进制表示法表示的任何有效 IP 地址? 【发布时间】:2011-01-21 18:10:40 【问题描述】:我可以使用什么正则表达式来匹配以点十进制表示法表示的任何有效 IP 地址?
【问题讨论】:
搜索 CPAN。您可以找到Data::Validate::IP等模块供您使用 +1 这是一个简单而有效的问题。 【参考方案1】:if($ip=~/^(\d1,3)\.(\d1,3)\.(\d1,3)\.(\d1,3)$/ &&(($1<=255 && $2<=255 && $3<=255 &&$4<=255 )))
print "valid\n";
else
print "Invalid\n";
【讨论】:
亲爱的朋友,从现在开始请推荐Data::Validate::IP。你亲爱的朋友。 @xxxxxxx 为什么?代码很简单,可以检查。 IPv4 很可能不会改变,并且在某些环境中添加模块依赖项并不是那么简单。【参考方案2】:CPAN 是您的朋友:Regex::Common 或 Net::IP::Match::Regexp。
【讨论】:
【参考方案3】:我喜欢这个……和 Steve Hajducko 的很像,但使用了引用的 reg ex which rooooock!
my $ip = '120.140.255.254'; # for example
my $ipno = qr/
2(?:5[0-5] | [0-4]\d)
|
1\d\d
|
[1-9]?\d
/x;
if ( $ip =~ /^($ipno\.)3$ipno$/ )
print "IP OK\n";
;
我去英国剑桥的 Arm 面试。他们让我在黑板上写一个,我写了一些蹩脚的......后来......我开始思考我的糟糕尝试,开始做一个更好的。被失败所驱使?或者也许只是真的被它激怒了。我还是得到了这份工作:)
【讨论】:
不错的一个。 :) 你介意在各个部分添加评论以便人们更好地理解吗?【参考方案4】:How do I write a regular expression that matches an IPv4 dotted address?
长话短说:不要这样做^^。
【讨论】:
【参考方案5】:如果你可以留下一个 perl 模块 - 那就去做吧。
怎么样:
if( $ip=~ m/^(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)/ &&
( $1 <= 255 && $2 <= 255 && $3 <= 255 && $4 <= 255 )
)
print "valid IP.";
【讨论】:
【参考方案6】:对于 A.B.C.D(十进制)格式的 IPv4,作为单行:
(?:(?:[01]?\d1,2|2[0-4]\d|25[0-5])\.)3(?:[01]?\d1,2|2[0-4]\d|25[0-5])
如果行中的地址后面没有任何内容,则可以将其承包到:
(?:(?:[01]?\d?\d?|2[0-4]\d|25[0-5])(?:\.|$))4
玩得开心。
【讨论】:
inet_aton 通常处理的格式远不止“A.B.C.D”,尝试“ping 10.4”或“ping 0x0a.077.0.4”看看会发生什么。 ...这就是为什么“A.B.C.D(十进制)格式的 IPv4”对于那些真正费心阅读的人明确说明的原因。 :) 用户输入数据并不关心你的限制。 :) 当然,一个人可能有特定的支持需求,例如IPV6 地址,或者遇到那些绝对肯定希望能够输入非 IPV4 ABCD 格式 IP 地址并仍然让它们假冒为有效(如果有效)的用户 - 但暂时假设高度隐含地声明(通过问题标签)“我在 Perl 中”的假设实际上并未被声明。假设您正在验证 javascript 中的表单字段——您既没有inet_aton
也没有 CPAN 来救援,并且也许你也不想写一公里长的正则表达式。:)
并且,郑重声明,您没有资格说明planetp的用户关心或不关心什么,因为您既不是这样的用户,也不是planetp。 :)【参考方案7】:
(?:(?:[01]?\d1,2|2[0-4]\d|25[0-5])\.)3(?:[01]?\d1,2|2[0-4]\d|25[0-5])
实际上匹配了一些无效的IP地址,例如:
192.168.00.001
稍微更精细的解决方案是:
(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.)3(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$
【讨论】:
【参考方案8】:带有端口号的 IPv4 ip 验证
if ( $ip =~ /(\d1,3)\.(\d1,3)\.(\d1,3)\.(\d1,3)(:(\d1,5))?/ )
if( $1 > 255 || $2 > 255 || $3 > 255 || $4 > 255)
print "invalid ip\n";
return ;
if( ( defined $6) && ( $6 > 65536 ))
print "invalid port\n";
return ;
print "valid ip \n";
else
print "invalid ip\n";
return ;
【讨论】:
【参考方案9】:$ip='123.0.0.1';
if($ip=~/^(\d1,3)\.(\d1,3)\.(\d1,3)\.(\d1,3)$/ &&((($1<=255 && $1 > 0) && $2<=255 && $3<=255 &&$4<=255 )))
print "valid\n";
else
print "Invalid\n";
块引用
在这种情况下,我们正在验证 0.0.0.0 不会被视为有效 IP。并支持所有剩余 IP 高达 1.0.0.0 到 255.255.255.255`在此处输入代码
块引用
【讨论】:
【参考方案10】:不知道为什么我在任何地方都看不到这个,它简短、简洁且很棒。
([0-9]1,3\.)3[0-9]1,3
【讨论】:
主要是因为perl有这种东西的特性。 这将匹配 562.93.612.3,它不是 IP。 它有什么了不起的?它也允许无效IP地址的事实?它将允许999.999.999.999
。以上是关于我可以使用啥正则表达式来匹配以点十进制表示法表示的任何有效 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章