字符串中给定数量的字符的完全匹配

时间:2016-01-26 03:30:45

标签: arrays ruby regex string

我有一个字符串数组:

strings = ['fo','foo','fooo'] 

为了找到只有oo的字符串,我应该编写什么代码?

我尝试了以下代码

strings.select!{|string| string.include? 'oo'}
#=> ['foo','fooo']

但是,'fooo'不是我想要的结果数组,在这种情况下,只应返回一个['foo']的数组。

5 个答案:

答案 0 :(得分:1)

  

我应该编写什么代码才能找到其中只有oo的字符串?

strings.select{|e| e == "oo"}

答案 1 :(得分:1)

也许这个?

strings.select { |s| s.count('o') == 2 && /o{2}/ =~ s }

修改 根据评论编辑正确性。

答案 2 :(得分:1)

这是一种方法。

strings = ['fo','foo','fooo', 'oofo', 'oofoo', 'oof', 'photo', 'photoo', "hi"]

s = strings.select do |s| 
    s.chars.each_cons(2).map(&:join).count("oo") == 1
end
#=> ["foo", "oofo", "oof", "photoo"]

答案 3 :(得分:1)

确定字符串是否包含一个或多个“xooy”形式的字符串,其中“x”和“y”是除“o”以外的任何字符,但不包含字符串“xoy”和“ooo”(并且,通过扩展,没有“oooo”等),您可以执行以下操作:

def double_os_only?(str)
  str.scan(/o+/).map(&:size).minmax == [2,2]
end

strings = ['fo','foo','fooo', 'oofo', 'oofoo', 'oofooo', 'photo', 'potatoo', "dang"]
strings.map { |s| puts "#{ s } => #{ double_os_only?(s) }" }

fo      => false
foo     => true
fooo    => false
oofo    => false
oofoo   => true
oofooo  => false
photo   => false
potatoo => false
dang    => false

请注意,如果str.scan(/o+/) #=> [][].map(&:size) #=> [][].minmax #=> [nil,nil]

另一种方法是修改@Avinash给出的正则表达式:

R = /
    ^             # match beginning of the line
    (?:           # begin a non-capture group
      [^o]*       # match zero or more characters other than 'o'
      oo          # match 'oo'
      [^o]*       # match zero or more characters other than 'o'
      (?!o)       # do not match 'o' in a negative lookahead
    )+            # end the non-capture group and perform >= 1 times
    $             # match end of line
    /x            # extended/free-spacing regex definition

def double_os_only?(str)
  !!(str =~ R)
end

!将真实值转换为false,将虚假值转换为true。因此,!!会将真实值转换为true,将假值转换为false

答案 4 :(得分:0)

使用否定的外观..

> strings.select{ |i| i[/(?<!o)oo(?!o)/] }
=> ["foo"]

(?<!o)声称匹配不会以o开头,(?!o)声称匹配后不会被o

匹配包含2 o&#39;

的字符串
strings.select{ |i| i[/^[^o]*oo[^o]*$/] }