【问题标题】:Matching an email address only if a known prefix isn't present仅当不存在已知前缀时才匹配电子邮件地址
【发布时间】:2019-04-30 04:45:52
【问题描述】:

我正在编写一个正则表达式来匹配电子邮件地址,但前提是电子邮件之前不存在某个前缀。 (这似乎适用于任何非文字字符串匹配器后负回溯。)

我尝试过使用否定的lookbehind,但如果存在前缀,则只能成功地设法不匹配电子邮件地址的第一个字符。

(?<!From: )([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)

首先,不要介意电子邮件地址匹配器,它很粗糙,但在我的用例中有效,而且这个问题可以适用于任何非文字字符串匹配器,用文字替换捕获组可以按预期工作。

我希望它匹配的是电子邮件地址,如果前缀 "From: " 不在它前面。

这不应与地址匹配

18.4.2019 9:35:02.115(22)->:From: address@subdomain.domain.tld

这应该与地址匹配

RCPT TO:<address@domain.tld>

我尝试的正则表达式的作用是,它正确匹配没有前缀的电子邮件地址,但在前缀的情况下,它也匹配它们,除了第一个字母显然是唯一匹配否定后向的字母。确实有道理。

有没有办法让消极的后视应用到整个捕获组?还是应该用不同的表达方式来解决这个问题?

【问题讨论】:

    标签: c# regex lookbehind


    【解决方案1】:

    在 C# 的正则表达式引擎中(也在其他引擎中)允许非固定长度的后视,因此您只需稍微修改正则表达式,更改后视:

    (?<!From: .*)
    

    Demo

    【讨论】:

      【解决方案2】:

      另一种选择是匹配您不想要的内容并使用alternation 捕获您想要的内容:

      what you do not want|(what you do want)

      你的模式可能看起来像:

      From: [a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+|([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)
      

      Regex demo

      【讨论】:

        猜你喜欢
        • 2016-03-20
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        • 2012-07-04
        • 2023-04-03
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        相关资源
        最近更新 更多