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

时间:2010-12-20 13:43:56

标签: ruby regex

我有很多话: 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, ol, b, l,则此搜索将针对openboil等字词返回true,但我需要搜索包含的字词其中三个o或两个l和一个b

UPD:

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

更新2

糟糕的解决方案,例如:

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

4 个答案:

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

但这与西里尔字母无关:(