2012-12-23 69 views
7

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

[email protected] 
John <[email protected]> 
John Doe <[email protected]> 
"John Doe" <[email protected]> 

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

预期的结果是:

[email protected] 
Name: nil 
Email: [email protected] 

John <[email protected]> 
Name: John 
Email: [email protected] 

John Doe <[email protected]> 
Name: John Doe 
Email: [email protected] 

"John Doe" <[email protected]> 
Name: John Doe 
Email: [email protected] 

这是我迄今取得的进展:

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

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

+0

有效电子邮件的所有possiblities您有什么?请注意,用于验证所有电子邮件的正则表达式可能很大。您需要澄清所有电子邮件是否被认为是正确的。 –

+0

我不需要验证电子邮件。 – hpique

+0

您的链接无法使用。 –

回答

12

下面的正则表达式似乎对所有的输入工作,仅使用两个捕获组:

(?:"?([^"]*)"?\s)?(?:<?([email protected][^>]+)>?) 

http://regex101.com/r/dR8hL3

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

+0

在我最新的js项目中工作得很完美(迄今为止) – electblake

0

你可以试试这个(相同的代码因为电子邮件是在第2组或第3组中返回的,这取决于是否给出了名称。

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

有没有办法让它保持在同一个捕获组? – hpique

+0

@hpique:取决于你的语言和正则表达风格。如果支持,可以使用'(?| ...)'构造来完成,否则可能会使'<' and '>'为可选。如果需要验证,可以使用条件语句或任何其他聪明的构造来完成:-)。 –

1

使用这个表达式"?([^"]*)"?\s*([^\s][email protected]+)

1组包含名称

组2包含电子邮件

+0

为什么downvote?它非常接近。 – hpique

+0

+1用于指向正确的方向。 – hpique

0

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

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