我想编写一些代码,从文本文件中提取单词列表,然后为其提供一堆字母,然后匹配包含所有这些字母的单词。因此,如果我输入字母“lheol”,它将匹配“hello”。
我正在考虑的正则表达式是这样的:
string =~ /(?=.*l{2})(?=.*h{1})(?=.*o{1})(?=.*e{1}).*/i
但是,当我只想让它匹配单词“hello”时,它会匹配说“Hellod”。
有任何想法吗?
用正则表达式解决这个问题并不合适,因为一个单词中可能有大量的字母组合。考虑改为对搜索词和每个目标的字母进行排序并检查字符串是否相等。
class String
def sort
self.chars.sort.join.downcase
end
end
'hello'.sort # => 'ehllo'
'leloh'.sort # => 'ehllo'
'Hellod'.sort # => 'dehllo'
A regular expression isn't really needed. If you just want to find out if a word contains at least one instance of each letter, you can check for character inclusion.
def word_match(word, letters)
letters.split(//).uniq.each { |char| return false unless word.include? char }
true
end
The nice thing about doing it this way is that you fail fast anytime a letter isn't found.
只是为了向您展示如何使用正则表达式来完成(这也意味着如果需要,尝试所有可能的组合的负担在于正则表达式引擎):
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 次,并且检查了所有五个捕获组。