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固定