【发布时间】:2016-02-23 20:32:21
【问题描述】:
这是我目前形成的正则表达式:
/(?:("?(?:.*)"?)\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>后一个块的“名称”字段中的误报,所以我需要一种排除这些的方法(可能使用前面的
:、:、=、for、@987654329 @,of?)
作为一个完整的正则表达式新手,我希望有人能提供一些关于我如何克服这些问题的指导。
出于好奇,我很遗憾丢失了我的 CardDAV 以及所有联系人,所以以真正的 Linux 方式,我将通过手动解析我的整个原始 MBOX 来重建一个电子邮件列表,按最常见的排序,然后去从那里开始。
我将使用 bash grep 或 perl sed。
感谢您的宝贵时间!
【问题讨论】:
-
bash 和 javascript?
-
如果可能的话,我想像现在一样使用 bash/grep。但据我了解,正则表达式存在复杂性限制,因此如果需要,我很乐意使用 javascript 或 perl。
-
JS 正则表达式比 bash 更受限制。而bash提供了
sed,它使用了Perl的正则表达式。 -
我没有意识到这一点,我读到相反的情况。我知道使用 GNU
grep,因为它可以使用 perl 正则表达式,但我没有想到sed。无论哪种方式,我都更喜欢 bash,所以使用grep或sed是完美的。 -
从您的示例中,
envelope-from=john.smith@gmail.com可能也是一个有效的电子邮件地址;没有上下文,就无法判断。