2

这是我的正则表达式新手问题:

  • 如何检查字符串是否包含 3 个垃圾邮件词?(例如:伟哥、药丸和商店)
  • 我怎样才能检测到诸如“v-iagra”或“v.iagra”之类的垃圾邮件词的变体?(一个额外的字符)
4

2 回答 2

3

正则表达式似乎不太适合这个特定的钉子。对于您的列表,您可以简单地将所有列入黑名单的单词放入某种排序列表中,然后针对该列表扫描每个标记。直接字符串操作总是比调用正则表达式引擎快。

对于您的变体(“v-iagra”等),我会删除所有非字符(如@Kinopiko 建议的那样),然后再次将它们从您的黑名单中运行。如果您对“viiagra”等内容持谨慎态度,我会查看Aspell。这是一个很棒的库,看起来 CPAN 有一个 Perl 绑定。

于 2009-11-14T11:05:40.403 回答
2

如何检查字符串是否包含 3 个垃圾邮件词?(例如:伟哥、药丸和商店)

发现这三个词中的任何一个的正则表达式可能如下所示(Perl):

if ($string =~ /(viagra|pills|shop)/) {
    # spam
}

如果您想找出所有三个,单独的正则表达式是不够的:

my $bad_words = 0;
while ($string =~ /(viagra|pills|shop)/g) {
     $bad_words++;
}
if ($bad_words >= 3) {
     # spam
}

我怎样才能检测到诸如“v-iagra”或“v.iagra”之类的垃圾邮件词的变体?(一个额外的字符)

仅使用正则表达式并不容易做到这一点。你可以尝试类似的东西

 $string =~ s/\W//g;

删除所有非单词字符,如 . 和 -,然后使用上面的测试检查字符串。不过,这也会去掉空格。

于 2009-11-14T10:03:42.140 回答