Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在非捕获组RegEx中捕获电子邮件地址_Regex_Yaml - Fatal编程技术网

在非捕获组RegEx中捕获电子邮件地址

在非捕获组RegEx中捕获电子邮件地址,regex,yaml,Regex,Yaml,我是regex新手,我真的很难确定如何指定一个特定的数据范围,用一个非捕获组解析,然后用捕获组过滤数据 具体来说,我使用Invoice2Data解析pdf发票,需要为解析模板设置yaml文件。yaml文件使用正则表达式为invoice2data设置解析模板 例如,假设我有一张发票。页面上有多个电子邮件地址,但我只想捕获“发票”后面的电子邮件: 我知道我可以用如下方式捕获这些行:(?I)For\s(?:^(?.*\n){4},返回: John Doe 555 Nowhere Ave johndoe

我是regex新手,我真的很难确定如何指定一个特定的数据范围,用一个非捕获组解析,然后用捕获组过滤数据

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

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

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

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


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

您可以使用与
发票匹配的模式,然后是所有不以电子邮件地址开头的行,如模式或
|
发票,用于使用负向前瞻
(?!

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

然后在组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_-]+)

^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_-]+)