我想确保字符串具有 ip 地址的格式。我不需要任何太具体的东西。我只想检查.
字符串中是否有三个。我可以检查那里是否.
有这样的:
str.include? '.'
但是如何检查多个.
?
谢谢!
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
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
这是“不要重新发明工作轮子”的案例之一。
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 的答案。