文字列をスキャンして単語の出現を検出する場合は、を使用scan
して単語を検索します。
Regexp.union
ブラックリスト内の文字列を検索するパターンを作成するために使用します。結果をでラップして、\b
一致する単語境界を強制し、大文字と小文字を区別しない検索を使用することをお勧めします。
Regexp.union
どのように役立つかについてのアイデアを与えるために:
words = %w[foo bar]
Regexp.union(words)
=> /foo|bar/
'Daniel Foo killed him a bar'.scan(/\b#{Regexp.union(words)}\b/i)
=> ["foo", "bar"]
Regexp.new
またはを使用してパターンを作成することもできます。または/.../
、もう少し制御したい場合は、次のようにします。
Regexp.new('\b(?:' + words.join('|') + ')\b', Regexp::IGNORECASE)
=> /\b(?:foo|bar)\b/i
/\b(?:#{words.join('|')})\b/i
=> /\b(?:foo|bar)\b/i
'Daniel Foo killed him a bar'.scan(/\b(?:#{words.join('|')})\b/i)
=> ["Foo", "bar"]
アドバイスとして、不快だと思う単語をブラックリストに載せることは、ユーザーによって簡単にだまされ、多くの「不快な」単語は特定のコンテキストでのみ不快であるため、間違った結果をもたらすことがよくあります。ユーザーは、意図的にスペルを間違えたり、「l33t」スピーチを使用したりして、リストを絶えず更新する代替スペルをほぼ無尽蔵に提供することができます。システムをだますことは、一部の人々にとって楽しみの源です。
私はかつて同様の仕事を与えられ、「不快な」単語の代替スペルを提供する翻訳者を書きました。インターネットから収集した単語と用語のリストから始めて、コードの実行を開始しました。数百万の代替がデータベースに追加された後、私はプラグを抜いて、それをだますのは簡単だったので、それがばか者の用事であることを管理に示しました。