用于在Ruby中验证IPv4地址的正则表达式

3

我想在Ruby中验证给定的字符串是否是有效的IPv4地址。我尝试了以下方法,但它会将大于255的值匹配为有效地址。如何限制每个块的范围为0-255。

str="255.255.255.256"
if str=~ /\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b/
puts true
else
puts false
end

1
如果你真的想坚持使用正则表达式解决方案,可以参考这个链接:https://dev59.com/UnVD5IYBdhLWcg3wDXF3 - samuil
4个回答

15

在Ruby中,你可以使用IPAddr类。无需使用正则表达式进行验证,只需创建一个新对象,并在失败时捕获异常即可:

require 'ipaddr'

ip = IPAddr.new "127.0.0.1"
# => #<IPAddr: IPv4:127.0.0.1/255.255.255.255>

ip = IPAddr.new "127.0.0.a"
# => IPAddr::InvalidAddressError: invalid address

2
实际上,仅仅捕获这个异常是不足以确保你拥有一个IPv4地址的,你还需要检查ip.ipv4?是否返回true。考虑文档中给出的例子:IPAddr.new "3ffe:505:2::1"。这并不会引发异常,因为它是一个有效的IPv6地址。 - MatzFan

9
block = /\d{,2}|1\d{2}|2[0-4]\d|25[0-5]/
re = /\A#{block}\.#{block}\.#{block}\.#{block}\z/

re =~ "255.255.255.255" # => 0
re =~ "255.255.255.256" # => nil

1
非常感谢@sawa。您的回答帮助我更好地理解了正则表达式。最终,我自己创建了一个新的正则表达式。 - Aniket
你为什么要改正则表达式?你的是错的,它不接受“199”作为一个块。而且,显式地返回布尔值是一个不好的想法。如果你想将结果转换为布尔值,请对结果使用 !! - sawa
是的,我错了,再次感谢。 - Aniket
1
不起作用 :( - re =~ '192.168.0.74' => nil - Roman Gaufman
@RomanGaufman 谢谢,我已经修复了。 - sawa
Ruby 2.5.1 存在问题 > re =~ ".255.255.255" => 0 它返回了0,但实际上不应该这样。 - user2699706

7

建议使用 Ruby 核心类 IPAddress

您可以按照以下方式实现:

 require "ipaddress"

 IPAddress.valid? "192.128.0.12"
 #=> true

 IPAddress.valid? "192.128.0.260"
 #=> false

您可以在这里查找更多信息:如何检查字符串中的值是否为IP地址


我不想使用内置函数。 - Aniket
6
实际上,ipaddress 是一个 gem(宝石),而不是核心类。 - toro2k

1
这是一种阅读起来相当容易的方式:

str.count('.')==3 && str.split('.').all? {|s| s[/^\d{3}$/] && s.to_i < 256}

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