正则表达式匹配包含某些字母的单词

时间:2012-05-12 05:24:38

标签: ruby regex

我想编写一些代码,从文本文件中提取单词列表,然后为它提供一堆字母,然后匹配包含所有这些字母的单词。所以,如果我输入字母“lheol”,它将匹配“你好”。

我正在考虑的正则表达式是这样的:

string =~ /(?=.*l{2})(?=.*h{1})(?=.*o{1})(?=.*e{1}).*/i

然而,当我只想让它与“你好”这个词相匹配时,那会匹配“Hellod”。

有什么想法吗?

3 个答案:

答案 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次重复,并且所有五个捕获组都被检查。