在垃圾邮件检测中避免负先行正则表达式

Avoid negative lookahead regex in mail spam detection

典型的合法电子邮件“header 来自”字段如下所示:

From: DHL <noreply@dhl.com>

From: DHL <legit.sender@noreply.dhl.com>

非合法电子邮件“header 来自”字段看起来像:

From: DHL <fake.sender@somedomain.com>

我想写一个匹配非合法电子邮件“header from”的正则表达式,也就是说,如果 DHL 出现在“From:”之后,那么 <> 中的内容必须以 dhl.com

结尾

我使用负前瞻法得到了以下正则表达式(不确定它是否 100% 准确,但它似乎有效):

^From: DHL <.*@(?!.*dhl\.com>$)

现在的问题是我的正则表达式引擎不支持负前瞻,我正在尝试用等效的非捕获组替换它,例如:

(?:[^d]|d[^h]|dh[^l]|dhl[^\.]|dhl\.[^c]|dhl\.c[^o]|dhl\.co[[^m])

到目前为止还没有成功。有什么想法吗?

如果有解决方案,我也想支持大小写混合(比如DhL.COm)。

我正在寻找一种 Postfix 解决方案,最好是不需要 PCRE 的解决方案。

我认为这符合要求。

(?<=^From: DHL <).*dhl\.com(?=>$)

只需更改:

^From: DHL 

并将其与

匹配
.*dhl\.com

并且在域领域更通用一些:

(?<=^From: DHL <).*dhl\.([a-zA-Z]{1,3})(?=>$)

因为你不能使用负前瞻而且你只知道你不想匹配什么你将不得不逐个字母地测试它有很多 |运营商

像这样的东西应该可以工作:

^From: DHL <.*@.*[^mM]>$|^From: DHL <.*@.*[^oO][mM]>$|^From: DHL <.*@.*[^cC][oO][mM]>$|^From: DHL <.*@.*[^.][cC][oO][mM]>$|^From: DHL <.*@.*[^lL][.][cC][oO][mM]>$|^From: DHL <.*@.*[^hH][lL][.][cC][oO][mM]>$|^From: DHL <.*@.*[^dD][hH][lL][.][cC][oO][mM]$>