Ruby 正则表达式:如果包含三个字母

Ruby 正则表达式:如果包含三个字母,ruby,regex,Ruby,Regex,我有几个词: 你好,毒药,世界,搜索,回声… 我有一些字母e,h,o 现在我需要找到所有包含这些字母的单词。像e、h、o的search、echo 我可以这样搜索: 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,但我

我有几个词:
你好,毒药,世界,搜索,回声…
我有一些字母
e,h,o
现在我需要找到所有包含这些字母的单词。像
e、h、o的
search、echo

我可以这样搜索:

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 }
upd 2

错误的解决方案,例如:

"lllllll".count("lua") #=> 5

对此,最好不要使用正则表达式,但可以这样做:

所有三个字母都不同:

/^(?=.*a)(?=.*b).*c/
/^(?=.*a.*a).*b/
两个相同,一个不同:

/^(?=.*a)(?=.*b).*c/
/^(?=.*a.*a).*b/
所有三个都是相同的:

/^.*a.*a.*a/

考虑修改单词(使其在每次检查时变小)


你确定要一个regexp吗?字符串支持计算其中的值,您可以使用该功能。大概是这样的:

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

看起来很疯狂,但很有效:

leters = "abc"
words.select{ |w| w.count(letters) >= 3 }

但它不适用于西里尔字母:(

@floor:计算目标三个字母中每个字母的频率,然后检查每个字母在您测试的单词中出现的次数。有多少个单词?如果您想在整个词典中获得良好的性能,解决方案会有所不同。您的文本有多大?是否需要运行几个3-le我将运行几个集合(每次20-30个)问题是找到数组中与我的字母集合匹配的所有单词。为什么我们不能只使用
单词。选择{w | w.count(字母)}
得到它。我喜欢这种方式。Thx!广义:
单词。选择{w | w.count(字母)>=letters.size}
一个严重的问题:
“lllll.count(alo)#=>5
:(西里尔字母用
jcount固定