【问题标题】:Capture email address within non-capturing group RegEx在非捕获组 RegEx 中捕获电子邮件地址
【发布时间】:2021-03-10 11:14:09
【问题描述】:

我是正则表达式的新手,我真的很想知道如何指定特定范围的数据以使用非捕获组进行解析,然后使用捕获组过滤该数据。

具体来说,我正在使用 Invoice2Data 来解析 pdf 发票,并且需要为我的解析模板设置一个 yaml 文件。 yaml 文件使用正则表达式为 invoice2data 设置解析模板。

例如,假设我有一张发票。页面上有多个电子邮件地址,但我只想捕获“发票”之后的电子邮件:

Invoice for
John Doe
555 Nowhere Ave
johndoe@email.com
555.555.5555

我知道我可以通过以下方式捕获这些行:(?i)For\s(?:^(?:.*\n){4}) 返回:

John Doe
555 Nowhere Ave
johndoe@email.com
555.555.5555

问题是,例如,我不知道如何解析这个非捕获组以仅捕获电子邮件。我有这个正则表达式来查找电子邮件:([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+) 但它本身将包括发票中的所有电子邮件。另一个问题是并非所有发票都有地址,因此实际行号可能因发票而异。

如何混合使用:(?i)For\s(?:^(?:.*\n){4})([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+) 以仅从发票的特定部分提取电子邮件?

【问题讨论】:

    标签: regex yaml


    【解决方案1】:

    您可以使用与 Invoice for 匹配的模式,后跟不以电子邮件地址开头的所有行,例如模式或 | 使用否定前瞻 (?! 的发票

    在前瞻中检查 Invoice for 可防止匹配错误发票的电子邮件地址,因为电子邮件地址可以是可选的。

    然后使用您的特定模式在 组 1 中捕获电子邮件地址。

    ^Invoice for(?:\r?\n(?![^\s@]+@[^\s@]|Invoice for\b).*)*\r?\n([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)
    

    Regex demo

    或者在否定前瞻中也使用您的完整电子邮件模式

    ^Invoice for(?:\r?\n(?![a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]|Invoice for\b).*)*\r?\n([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)
    

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-07
      • 2017-04-25
      • 2021-07-02
      • 2018-03-07
      • 1970-01-01
      • 2019-05-07
      • 2019-03-08
      • 2013-12-04
      相关资源
      最近更新 更多