检查一个字符串是否包含Ruby中多次出现的字符?

时间:2013-06-06 16:52:17

标签: ruby string

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

 str.include? '.'

但是如何检查多个.

谢谢!

3 个答案:

答案 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