我想确保字符串具有ip地址的格式。我不需要太具体的东西。我只想检查字符串中是否有三个.
。我可以检查那里是否有一个.
:
str.include? '.'
但是如何检查多个.
?
谢谢!
答案 0 :(得分: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
答案 1 :(得分: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的答案。
答案 2 :(得分:5)
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