Extract email and name with regex

喜你入骨 提交于 2020-01-19 05:33:45

问题


What would be the regular expressions to extract the name and email from strings like these?

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

It can be assumed that the email is valid. The name will be separated by the email by a single space, and might be quoted.

The expected results are:

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

This is my progress so far:

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

(which can be tested here: http://regexr.com/?337i5)


回答1:


The following regex appears to work on all inputs and uses only two capturing groups:

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

http://regex101.com/r/dR8hL3

Thanks to @RohitJain and @burning_LEGION for introducing the idea of non-capturing groups and character exclusion respectively.




回答2:


use this regex "?([^"]*)"?\s*([^\s]+@.+)

group 1 contains name

group 2 contains email




回答3:


You can try this (same code as yours but improved), but you need to check returned groups after matching because the email is either returned in group 2 or group 3, depending on whether a name is given.

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



回答4:


This way you can get with or without name, removing the quotes.

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



回答5:


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



来源:https://stackoverflow.com/questions/14010875/extract-email-and-name-with-regex

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!