これが私の正規表現の初心者の質問です:
- 文字列に 3 つのスパム ワードが含まれているかどうかを確認するにはどうすればよいですか? (例: バイアグラ、錠剤、ショップ)
- 「v-iagra」や「v.iagra」などのスパム ワードのバリエーションを検出するにはどうすればよいですか? (1文字追加)
Regex は、この特定の釘に対して適切なハンマーとは思えません。リストについては、ブラックリストに登録されているすべての単語を何らかのソートされたリストに単純に投入し、そのリストに対して各トークンをスキャンすることができます。直接文字列操作は、定期的に正規表現エンジンを呼び出すよりも常に高速です。
あなたのバリエーション(「v-iagra」など)については、(@Kinopikoが提案したように)すべての非文字を削除してから、ブラックリストを通過して再度実行します。「viiagra」などに警戒するなら、Aspellを調べてみます。これは優れたライブラリであり、CPAN には Perl バインディングがあるようです。
文字列に 3 つのスパム ワードが含まれているかどうかを確認するにはどうすればよいですか? (例: バイアグラ、ピル、ショップ)
これら 3 つの単語のいずれかを見つけるための正規表現は次のようになります (Perl):
if ($string =~ /(viagra|pills|shop)/) {
# spam
}
3 つすべてを見つけたい場合は、正規表現だけでは十分ではありません。
my $bad_words = 0;
while ($string =~ /(viagra|pills|shop)/g) {
$bad_words++;
}
if ($bad_words >= 3) {
# spam
}
「v-iagra」や「v.iagra」などのスパム ワードのバリエーションを検出するにはどうすればよいですか? (1文字追加)
正規表現だけでそれを行うのはそれほど簡単ではありません。次のようなものを試すことができます
$string =~ s/\W//g;
のような単語以外の文字をすべて削除します。および - で、上記のテストを使用して文字列をチェックします。ただし、これによりスペースも削除されます。