问题
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