【问题标题】:Regular expression to validate IPv4 address in ruby [duplicate]在ruby中验证IPv4地址的正则表达式[重复]
【发布时间】:2014-04-17 06:29:24
【问题描述】:

我想在 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

【问题讨论】:

标签: ruby regex


【解决方案1】:

您在 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

【讨论】:

  • 其实仅仅捕捉到这个异常并不足以保证你有一个IPv4地址,你还需要检查ip.ipv4?返回true。考虑文档中给出的示例:IPAddr.new "3ffe:505:2::1"。这不会引发异常,因为它是有效的 IPv6 地址。
【解决方案2】:
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

【讨论】:

  • 非常感谢@sawa。您的回答帮助我以更好的方式理解正则表达式。最后我自己创建了一个新的正则表达式。
  • 为什么要更改正则表达式?你的错了;它不接受 "199" 作为一个块。此外,显式返回布尔值是一个坏主意。如果要将结果转换为布尔值,请对结果执行!!
  • 是的,我错了,谢谢。
  • 不起作用 :( - re =~ '192.168.0.74' => nil
  • @RomanGaufman 谢谢,我修好了。
【解决方案3】:

你最好使用ruby核心类IPAddress

你可以这样做:

 require "ipaddress"

 IPAddress.valid? "192.128.0.12"
 #=> true

 IPAddress.valid? "192.128.0.260"
 #=> false

你可以在这里找到更多How do I check whether a value in a string is an IP address

【讨论】:

  • 我不想使用内置函数。
  • 其实ipaddress是个gem,不是核心类。
【解决方案4】:

这是一种很容易阅读的方式:

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

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 2021-07-22
    • 2011-08-10
    • 2018-02-27
    • 2020-12-05
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多