13

从这样的字符串中提取名称和电子邮件的正则表达式是什么?

johndoe@example.com
John <johndoe@example.com>
John Doe <johndoe@example.com>
"John Doe" <johndoe@example.com>

可以假设电子邮件是有效的。该名称将通过电子邮件由一个空格分隔,并且可能会被引用。

预期结果是:

johndoe@example.com
Name: nil
Email: johndoe@example.com

John <johndoe@example.com>
Name: John
Email: johndoe@example.com

John Doe <johndoe@example.com>
Name: John Doe
Email: johndoe@example.com

"John Doe" <johndoe@example.com>
Name: John Doe
Email: johndoe@example.com

这是我到目前为止的进展:

(("?(.*)"?)\s)?(<?(.*@.*)>?)

(可以在这里测试:http ://regexr.com/?337i5 )

4

6 回答 6

19

以下正则表达式似乎适用于所有输入,并且仅使用两个捕获组:

(?:"?([^"]*)"?\s)?(?:<?(.+@[^>]+)>?)

http://regex101.com/r/dR8hL3

感谢 @RohitJain 和 @burning_LEGION 分别介绍了非捕获组和字符排除的概念。

于 2012-12-23T13:51:49.337 回答
1

使用这个正则表达式"?([^"]*)"?\s*([^\s]+@.+)

第 1 组包含名称

第 2 组包含电子邮件

于 2012-12-23T12:33:42.173 回答
1
(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))

https://regex101.com/r/pVV5TI/1

于 2018-02-20T16:59:12.563 回答
0

您可以试试这个(与您的代码相同但改进了),但您需要在匹配后检查返回的组,因为电子邮件是在第 2 组或第 3 组中返回的,具体取决于是否给出了名称。

(?:("?(?:.*)"?)\s)?<(.*@.*)>|(.*@.*)
于 2012-12-23T12:27:42.853 回答
0

通过这种方式,您可以使用或不使用名称,删除引号。

\"*?(([\p{L}0-9-_ ]+)\"?)*?\b\ *<?([a-z0-9-_\.]+@[a-z0-9-_\.]+\.[a-z]+)>?
于 2016-06-02T00:37:49.857 回答
0

尽管@hpique 有一个很好的答案,但该解决方案仅在名称/电子邮件字符串是正则表达式中唯一被分析的内容时才有效。当您有包含其他项目(例如电子邮件)的较长消息时,它将不起作用。当此人包含中间名时,许多其他解决方案也将无法匹配(即 James Herbert Bond <jbond@example.com)。

这是我编写的一个更强大的正则表达式解决方案,即使字符串中还有许多其他内容,它也可以提取你想要的名字、姓氏和电子邮件:

/(?:"?)(\b[A-Z][a-z]+\b ?)(\b[A-Z][a-z]+\b ?)*(?:"?) ?<([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)>|([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/g

在此处查看上述语法:Regexr 上的示例

于 2021-03-26T19:02:59.040 回答