使用正则表达式提取电子邮件和名称

时间:2012-12-23 12:16:21

标签: regex language-agnostic

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

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

6 个答案:

答案 0 :(得分:13)

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

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

http://regex101.com/r/dR8hL3

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

答案 1 :(得分:1)

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

第1组包含名称

第2组包含电子邮件

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

\"*?(([\p{L}0-9-_ ]+)\"?)*?\b\ *<?([a-z0-9-_\.]+@[a-z0-9-_\.]+\.[a-z]+)>?

答案 4 :(得分:0)

(([^<>()\[\]\\.,;:\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

答案 5 :(得分:0)

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

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

/(?:"?)(\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

在此处查看上述语法:Example on Regexr