我正在试图弄清楚如何检测垃圾邮件中的额外字符,如:
pha.rmacy
或vi*agra
任何想法?
答案 0 :(得分:3)
您可以使用(dis)相似性指标,例如edit distance。例如, vi.agra 和 viagra 之间的编辑距离为1.
然后,如果它们之间的编辑距离低于某个阈值,例如2,则确定给定的单词与垃圾邮件单词相同。
但是如果你真的想使用正则表达式,你可以使用/[^a-zA-Z0-9-\s]/
这样的东西来删除单词中的标点符号。但话又说回来,你会发现像viZagra
这样的词与viagra
是同一个词。
答案 1 :(得分:2)
正则表达式似乎不是解决这个问题的合适工具。但是,作为尝试回答它只是因为它很有趣,一个简单的方法是做这样的事情:
/v.?i.?a.?g.?r.?a/
每个字母之间匹配0或1个字符。
答案 2 :(得分:1)
这取决于您想要匹配的广泛程度。以下内容将匹配散布在这些字母中的任何连续的非空格或字符字符序列:
/p[^\s\w]*h[^\s\w]*a[^\s\w]*r[^\s\w]*m[^\s\w]*a[^\s\w]*c[^\s\w]*y/
您可以在代码中构建此正则表达式。例如,在Perl中:
$re = join("[^\\s\\w]*", split("", "pharmacy"))
但最终,正则表达式可能无法满足您的所有要求。