我想编写一些代码,从文本文件中提取单词列表,然后为它提供一堆字母,然后匹配包含所有这些字母的单词。所以,如果我输入字母“lheol”,它将匹配“你好”。
我正在考虑的正则表达式是这样的:
string =~ /(?=.*l{2})(?=.*h{1})(?=.*o{1})(?=.*e{1}).*/i
然而,当我只想让它与“你好”这个词相匹配时,那会匹配“Hellod”。
有什么想法吗?
答案 0 :(得分:3)
使用正则表达式解决此问题并不合适,因为单词中可能存在大量字母组合。相反,请考虑对搜索词和每个目标的字母进行排序,并检查字符串是否相等。
class String
def sort
self.chars.sort.join.downcase
end
end
'hello'.sort # => 'ehllo'
'leloh'.sort # => 'ehllo'
'Hellod'.sort # => 'dehllo'
答案 1 :(得分:1)
不需要正则表达式。如果您只是想知道一个单词是否包含每个字母的至少一个实例,您可以检查字符包含。
def word_match(word, letters)
letters.split(//).uniq.each { |char| return false unless word.include? char }
true
end
以这种方式做这件好事就是你在找不到信件的时候快速失败。
答案 2 :(得分:1)
只是为了向您展示如何使用正则表达式完成(这也意味着如果需要,尝试所有可能的组合的负担在于正则表达式引擎):
if subject =~ /^(?:h()|e()|l()|l()|o()){5}\1\2\3\4\5$/
# Successful match
else
# Match attempt failed
end
诀窍在于每个字母后跟一个始终匹配的空捕获组()
。然后,在正则表达式的末尾,后向引用\1\2\3\4\5
确保每个字母都恰好参与了一次匹配(因为之前的交替允许恰好5次重复,并且所有五个捕获组都被检查。