我有很多话:
hello, poison, world, search, echo ...
我有一些信件e, h, o
现在我需要找到包含这些字母的所有单词。与search, echo
e, h, o
相同
我可以这样搜索:
words = %w[hello poison world search echo]
matched = words.select do |w|
%w[e,h,o].all?{ |l| w =~ /#{l}/ }
end
问题在于,如果字母为o, o, o
或l, b, l
,则此搜索将针对open
或boil
等字词返回true,但我需要搜索包含的字词其中三个o
或两个l
和一个b
UPD:
leters = "abc"
words.select{ |w| w.count(letters) >= 3 }
更新2
糟糕的解决方案,例如:
"lllllll".count("lua") #=> 5
答案 0 :(得分:1)
最好不要为此使用正则表达式,但可以这样做:
所有三个字母都不同:
/^(?=.*a)(?=.*b).*c/
两个相同和一个不同:
/^(?=.*a.*a).*b/
所有三个相同:
/^.*a.*a.*a/
答案 1 :(得分:1)
考虑修改单词(以便每次检查时它变小)。
words = %w(fooo for find o ooo)
matched = words.select do |orig|
# note: str.gsub! returns nil if nothing was replaced
w = orig.clone
%w(o o o).all?{ |l| w.gsub!(/^(.*)(#{l})(.*)$/, '\1\3') }
end
答案 2 :(得分:1)
您确定要进行正则表达式吗?字符串支持计算其中的值,您可以使用该功能。像这样:
words = ["pool", "tool", "troll", "lot"]
letters = "olo"
#find how many of each letter we need
counts = {}
letters.each { |v| counts[v] = letters.count(v) }
#See if a given work matches all the counts
# accumulated above
res = words.select do |w|
counts.keys.inject(true) do |match, letter|
match && (w.count(letter) == counts[letter])
end
end
答案 3 :(得分:0)
看起来很疯狂,但确实有效:
leters = "abc"
words.select{ |w| w.count(letters) >= 3 }
但这与西里尔字母无关:(