【问题标题】:Avoid negative lookahead regex in mail spam detection在邮件垃圾邮件检测中避免负前瞻正则表达式
【发布时间】:2021-07-31 08:00:15
【问题描述】:

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

From: DHL <noreply@dhl.com>

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

虽然非合法电子邮件“标头来自”字段如下所示:

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 的解决方案。

【问题讨论】:

  • 您使用的是哪个正则表达式引擎?如果是 Procmail,您可能需要多个条件。如果是 Postfix,我相信你可以想出一个使用 PCRE 正则表达式的方法。
  • 如果你可以反转条件,那么^From: DHL <.*dhl.com>$ 可以工作,你只是说当正则表达式不匹配时。
  • 不幸的是,Zachary Haber,这也将匹配所有非 DHL 来源的电子邮件。但是,如果您可以创建复合条件,那么像 ^From: DHL\s AND NOT ^From: DHL <.>$ 这样的东西就可以了。
  • @tripleee,postfix-pcre 确实是一种选择,但不幸的是,在我的情况下这是不可能的。
  • 那么,您是在寻找 Postfix 解决方案还是完全其他的解决方案?这会影响我们可以使用哪些精确的正则表达式工具。另请参阅Stack Overflow regex tag guidance,其中阐明了识别您想要支持的工具或平台的要求。

标签: regex regex-lookarounds postfix-mta email-spam


【解决方案1】:

我认为这符合要求。

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

只是改变:

^From: DHL 

并与之匹配

.*dhl\.com

在领域领域更概括一点:

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

【讨论】:

    【解决方案2】:

    由于您不能使用负前瞻,并且您只知道不想匹配的内容,因此您必须逐个字母地测试它,并使用大量 |运营商

    这样的事情应该可以工作:

    ^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]$>
    

    【讨论】:

    • 这很好用。现在我想匹配 中的内容是否以 dhl.com 或 dhl2.org 结尾。尝试了很多事情都没有成功:-(你能帮忙吗?
    • @user957479 我认为在单个正则表达式中是不可能的。您能做的最好的事情是为 dhl2.org 案例编写另一个案例,然后查看 dhl.com 和 dhl2.org 案例的匹配项。如果您尝试在单个正则表达式中执行此操作,您将不可避免地无法匹配 dhl.org 或 dhl2.com 甚至 dhl.oog 或来自这两种组合的其他字母组合的汤。
    • 感谢您的回答。不幸的是,写两个正则表达式对我不起作用。如果发件人使用 dhl2.org,那么第一个正则表达式(使用 dhl.com)将匹配并且用户邮件将被拒绝而不解释第二个正则表达式,所以我猜这里没有使用简单正则表达式的真正解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2011-10-14
    相关资源
    最近更新 更多