2

我想确保字符串具有 ip 地址的格式。我不需要任何太具体的东西。我只想检查.字符串中是否有三个。我可以检查那里是否.有这样的:

 str.include? '.'

但是如何检查多个.

谢谢!

4

3 回答 3

7

String#count计算其参数中每个字符的出现次数:

"127.0.0.1".count('.')
# => 3

所以从字面上回答你的问题,

"127.0.0.1".count('.') == 3
# => true

实际上,即使是糟糕的 IP 地址验证器,我也很难考虑。我可能会做这样的事情:

require 'ipaddr'

def validateIP(s)
  !!IPAddr.new(s) rescue false
end

validateIP('127.0.0.1')
# => true
validateIP('999.0.0.1')
# => false
于 2013-06-06T16:53:40.723 回答
7

String 有一个.count接收字符的方法。

str.count('.') == 3

编辑:

由于您要匹配 IP 地址,因此www.regular-expressions.info有一个使用正则表达式捕获 IP 的示例。

if possible_ip_address.match(%r{\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b})
  # code here...
end

这将捕获无效的地址(例如 999.999.0.1),但可以防止误报,例如

"not.real.ip.address".count('.') == 3 #=> true
于 2013-06-06T16:53:43.147 回答
7

这是“不要重新发明工作轮子”的案例之一。

Ruby 带有IPAddr类,用于操作 IP 地址。正则表达式包含在用于将目标 IP 字符串解析为八位字节的类中。重用IPAddr::RE_IPV4ADDRLIKE

require 'ipaddr'
IPAddr::RE_IPV4ADDRLIKE
=> /
    \A
    (\d+) \. (\d+) \. (\d+) \. (\d+)
    \z
  /x

\A由于和 ,此模式与整个字符串匹配\z。以下是一些范围测试:

'one.two.three.four'[IPAddr::RE_IPV4ADDRLIKE]
=> nil
'1.2.3.4'[IPAddr::RE_IPV4ADDRLIKE]
=> "1.2.3.4"
'foo 1.2.3.4 bar'[IPAddr::RE_IPV4ADDRLIKE]
=> nil
'128.255.255.255'[IPAddr::RE_IPV4ADDRLIKE]
=> "128.255.255.255"
'999.999.999.999'[IPAddr::RE_IPV4ADDRLIKE]
=> "999.999.999.999"
'0000.0000.0000.0000'[IPAddr::RE_IPV4ADDRLIKE]
=> "0000.0000.0000.0000"

如果在使用 IP 地址时需要更多功能,请查看IPAddress gem。这是很不错的。


要知道您是否真的收到了有效的IP 地址,请参阅@DarshanComputing 的答案。

于 2013-06-06T17:22:01.960 回答