我有一个字符串数组:
strings = ['fo','foo','fooo']
为了找到只有oo
的字符串,我应该编写什么代码?
我尝试了以下代码
strings.select!{|string| string.include? 'oo'}
#=> ['foo','fooo']
但是,'fooo'
不是我想要的结果数组,在这种情况下,只应返回一个['foo']
的数组。
答案 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]*$/] }