从这些字符串中提取名称和电子邮件的正则表达式是什么?
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)
答案 0 :(得分:13)
以下正则表达式似乎适用于所有输入,仅使用两个捕获组:
(?:"?([^"]*)"?\s)?(?:<?(.+@[^>]+)>?)
感谢@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,}))
答案 5 :(得分:0)
尽管@hpique 有一个很好的答案,但该解决方案仅在名称/电子邮件字符串是正则表达式中唯一被分析的内容时才有效。当您有包含其他项目(例如电子邮件)的较长消息时,它将不起作用。当此人包含中间名(即 James Herbert Bond 这是我编写的更强大的正则表达式解决方案,即使字符串中还有许多其他内容,它也可以根据需要获取名字、姓氏和电子邮件: 在此处查看上述语法:Example on Regexr/(?:"?)(\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