regex - 用于从文本中解析名称和电子邮件的正则表达式

标签 regex linux bash perl sed

<分区>

这是我到目前为止形成的正则表达式:

/(?:("?(?:.*)"?)\s*)?\s<(.*@.*)>|(?:mailto:(.*@.*))|(.*@.*)/gi

You can check it out at regex101

我正在尝试从以下内容中提取“姓名”和“电子邮件”:

John Smith <john.smith@gmail.com>
John Smith <johnsmith@gmail.com>
"John Smith" <johnsmith@gmail.com>
"John" <johnsmith@gmail.com>
John Smith<johnsmith@gmail.com>
<johnsmith@gmail.com>
johnsmith@gmail.com
mailto:johnsmith@gmail.com
"John"<johnsmith@gmail.com>

To: John Smith <john.smith@gmail.com>
From: John Smith <john.smith@gmail.com>
Reply-to: john.smith@gmail.com
Return-path: <john.smith@gmail.com>
Message-id: <john.smith@gmail.com>
References: <john.smith@gmail.com>
Original-recipient: rfc822;john.smith@gmail.com
for john.smith@gmail.com
ESMTPSA id <john.smith@gmail.com>
domain of john.smith@gmail.com
envelope-from=john.smith@gmail.com
(ORCPT john.smith@gmail.com)

从头开始,我觉得我差不多了 - 但在 3 件事上遇到了麻烦:

  • 从第一个捕获组中去除双引号

  • 处理空白缺失变体:John Smith<johnsmith@gmail.com>

  • 后一个 block 的“名称”字段中的误报,所以我需要一种排除这些的方法(可能使用前面的 ::=foridof ?)

作为一个完整的正则表达式新手,我希望有知识渊博的人给我一些指导,告诉我如何克服这些问题。

出于好奇,不幸的是,我丢失了我的 CardDAV,因此丢失了所有联系人,所以以真正的 Linux 方式,我将通过手动解析我的整个原始 MBOX 重建电子邮件列表,按最常见的排序,然后去从那里开始。

我将使用 bash grep 或 perl sed

感谢您的宝贵时间!

最佳答案

这是另一种可能的正则表达式,为了清楚起见,我将其分成三行,但应该在一行上:

\s*(?:.*?[:=;]|ORCPT|for|domain of|ESMTPSA id)?
\s*(?:"?([\w ]*?)[ "<])?
\s*<?([\w.]*?@[\w.]*)>?

第一行去掉了前缀,因此是非捕获的。它消除了以 :;= 或某些特定文字结尾的任何内容。

第二行和第三行分别是name和email的两个捕获组。

它正确解析了您提供的示例。

参见 regex fiddle .

Perl 解决方案

您可以启动此 perl 在线程序:

perl -ne 'while(/.../gi){print "$1|$2\n";}' yourinputfile

这将输出捕获的组 1 和 2,用竖线字符分隔:

John Smith|john.smith@gmail.com
John Smith|johnsmith@gmail.com
John Smith|johnsmith@gmail.com
John|johnsmith@gmail.com
John Smith|johnsmith@gmail.com
|johnsmith@gmail.com
|johnsmith@gmail.com
|johnsmith@gmail.com
John|johnsmith@gmail.com
John Smith|john.smith@gmail.com
John Smith|john.smith@gmail.com
|john.smith@gmail.com
|john.smith@gmail.com
|john.smith@gmail.com
|john.smith@gmail.com
|john.smith@gmail.com
|john.smith@gmail.com
|john.smith@gmail.com
|john.smith@gmail.com
|john.smith@gmail.com
|john.smith@gmail.com

关于regex - 用于从文本中解析名称和电子邮件的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33842183/

相关文章:

asp.net - 用于在开始和结束处允许空格的电子邮件正则表达式验证器

linux - Linux 上的 GetModuleHandle(NULL)

PHP5-Mcrypt安装报错无安装候选

bash - 如何 ${@ : -1} expand to last argument

bash - 如何提取文件的某些列并将它们保存在新文件中

regex - 如何在 Rust 中使用正则表达式从右侧查找?

regex - 使用 grep、sed 或 awk 获取 JSON 值

python - 匹配特定模式的正则表达式

Linux 管道示例。 ipc管道创建

linux - 将空格和\字符附加到每一行,最后一行除外