テキスト ファイルから単語のリストを取得し、一連の文字を指定して、それらすべての文字を含む単語と照合するコードを書きたいと思います。したがって、「lheol」という文字を入力すると、「hello」と一致します。
私が考えていた正規表現は次のようなものです:
string =~ /(?=.*l{2})(?=.*h{1})(?=.*o{1})(?=.*e{1}).*/i
ただし、「こんにちは」という単語と一致させたい場合は、「こんにちは」と言います。
何か案は?
正規表現を使用してこの問題を解決することは、単語内の文字の組み合わせが多数存在する可能性があるため、適切ではありません。代わりに、検索ワードと各ターゲットの文字を並べ替えて、文字列が等しいかどうかを確認することを検討してください。
class String
def sort
self.chars.sort.join.downcase
end
end
'hello'.sort # => 'ehllo'
'leloh'.sort # => 'ehllo'
'Hellod'.sort # => 'dehllo'
正規表現は実際には必要ありません。単語に各文字のインスタンスが少なくとも1つ含まれているかどうかを確認したいだけの場合は、文字が含まれているかどうかを確認できます。
def word_match(word, letters)
letters.split(//).uniq.each { |char| return false unless word.include? char }
true
end
この方法でそれを行うことの良いところは、文字が見つからないときはいつでも速く失敗することです。
正規表現を使用してそれを行う方法を示すだけです(これは、必要に応じて、可能なすべての組み合わせを試す負担が正規表現エンジンにあることも意味します)。
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
により、すべての文字が一致に 1 回だけ参加したことが確認されます (前の変更では正確に 5 回の繰り返しが許可され、5 つのキャプチャ グループすべてがチェックされるためです。