如何使用正则表达式仅提取邮件To行内的所有邮箱地址
正则提取To行邮箱地址方案
这个需求完全可以通过正则实现,你之前使用的<.*>规则没有添加行范围限制,因此会匹配全文所有尖括号包裹的内容,只要添加范围锚定即可满足要求。
推荐匹配规则
支持PCRE语法的正则环境(Python re、JavaScript ES2018+、Java、grep -P等)可以直接使用以下单行匹配规则,开启多行模式(m修饰符)即可直接提取所有目标邮箱:
(?:^To:|(?!^)\G)[^<\n]*<([^>]+)>
规则逻辑说明
(?:^To:|(?!^)\G)为范围定位段:仅从行首的To:标记开始匹配,后续匹配仅沿上一次匹配成功的结束位置继续,通过(?!^)排除行首位置,避免跨行匹配到其他行的尖括号内容[^<\n]*跳过当前位置到下一个左尖括号之间的无关字符,\n的限制确保匹配不会跳出To:所在的行<([^>]+)>匹配尖括号包裹的邮箱地址,第一个捕获组的内容就是你需要的邮箱值
兼容写法(适配不支持\G的老旧正则引擎)
如果你的使用环境不支持\G连续匹配锚点,可以分两步实现,兼容性覆盖几乎所有正则场景:
- 第一步开启多行模式,匹配To:开头的完整行:
^To:.*$ - 第二步在第一步匹配到的行内容中,使用规则
<([^>]+)>提取所有尖括号内的内容即可
匹配结果
针对你给出的测试文本,提取到的有效邮箱为:
vr.test@foo-gruppe.demax.mustermann@foo-gruppe.de
注:你给出的预期结果中第一个邮箱遗漏了后缀
.de,和原始文本中的实际邮箱值存在偏差。
内容的提问来源于stack exchange,提问作者MarvinB
相关产品推荐
相关产品推荐

