我对regex还很陌生,我真的很难用一个非捕获组来解析一个特定的数据范围,然后用一个捕获组过滤该数据。
具体来说,我使用Invoice2Data来解析pdf发票,并且需要为我的解析模板设置一个yaml文件。yaml文件使用regex为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_-]+)只从发票的特定部分提取电子邮件?
发布于 2020-11-27 17:22:09
您可以使用与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_-]+)或者在负面展望中使用您的完整电子邮件模式。
^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_-]+)https://stackoverflow.com/questions/65041263
复制相似问题