Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 新手正则表达式问题-检测垃圾邮件_Regex_Detect_Spam - Fatal编程技术网

Regex 新手正则表达式问题-检测垃圾邮件

Regex 新手正则表达式问题-检测垃圾邮件,regex,detect,spam,Regex,Detect,Spam,以下是我的regex新手问题: 如何检查字符串是否有3个垃圾词?(例如:伟哥、药丸和药店) 我怎样才能同时检测到“v-iagra”或“v.iagra”等垃圾词的变体?(增加一个字符) 如何检查字符串是否有3个垃圾词?(例如:伟哥、药丸和药店) 识别这三个单词中任何一个的正则表达式可能如下所示(Perl): 如果你想找出这三种情况,单靠正则表达式是不够的: my $bad_words = 0; while ($string =~ /(viagra|pills|shop)/g) { $

以下是我的regex新手问题:

  • 如何检查字符串是否有3个垃圾词?(例如:伟哥、药丸和药店)
  • 我怎样才能同时检测到“v-iagra”或“v.iagra”等垃圾词的变体?(增加一个字符)
如何检查字符串是否有3个垃圾词?(例如:伟哥、药丸和药店)

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

如果你想找出这三种情况,单靠正则表达式是不够的:

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;

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

对于这个特殊的钉子来说,Regex似乎不太合适。对于您的列表,您只需将所有被列入黑名单的单词放入某种排序列表中,然后根据该列表扫描每个标记。直接字符串操作总是比调用正则表达式引擎更快


对于您的变体(“v-iagra”,等等),我会删除所有非字符(正如@Kinopiko所建议的),然后再次运行它们通过您的黑名单。如果你对“viiagra”之类的东西有戒心,我会退房的。这是一个很棒的库,看起来CPAN有一个Perl绑定。

别忘了\W包含下划线。维乌·阿格拉仍然可以通过。像《代码》这样的替代品怎么样?伊格拉《代码》锁具只能让诚实的人保持诚实。如果有人真的很专注,他们会找到一种方法来写他们想写的东西。也就是说,对于
\/
之类的
V
,似乎最简单(阅读:最直接)的方法需要手动编译这些类型的转换列表,并将它们存储在映射中(如
[“\/”->“V”]
,然后在每个传入令牌上从该映射的每个元素运行一个机械字符串替换。
 $string =~ s/\W//g;