2012-12-23 10 views
7

Jakie byłyby wyrażenia regularne, aby wyodrębnić nazwę i adres e-mail z takich ciągów?Wyciąg e-mail i nazwisko z regex

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

Można założyć, że wiadomość e-mail jest ważna. Nazwa zostanie oddzielona przez e-mail o jedną spację i może być cytowana.

oczekiwane rezultaty to:

[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] 

To jest mój postęp tej pory:

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

(które mogą być badane tutaj: http://regexr.com/?337i5)

+0

Co wszystkie mozliwosci z ważnego e-maila należy rozwiązać? Zwróć uwagę, że wyrażenie regularne do sprawdzania poprawności wszystkich wiadomości e-mail może być rozległe. Musisz wyjaśnić, co wszystkie e-maile uważasz za poprawne. –

+0

Nie muszę potwierdzać adresu e-mail. – hpique

+0

Twój link nie działa. –

Odpowiedz

12

Poniżej regex wydaje się działać na wszystkich wejściach i wykorzystuje tylko dwie grupy przechwytywania:

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

http://regex101.com/r/dR8hL3

Dzięki @RohitJain i @burning_LEGION za wprowadzenie idei grup niezapisujących i wykluczenia znaków.

+0

działa idealnie w moim najnowszym projekcie js (do tej pory) – electblake

0

Można spróbować to (ten sam kod jako twój, ale poprawiony), ale musisz sprawdzić zwrócone grupy po dopasowaniu, ponieważ wiadomość e-mail jest zwracana w grupie 2 lub grupie 3, w zależności od tego, czy podano nazwę.

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

Czy nie można go zatrzymać w tej samej grupie przechwytującej? – hpique

+0

@ hpique: Zależy od twojego języka i smaku wyrażeń regularnych. Można to zrobić za pomocą konstruktu '(? | ...)', jeśli jest to obsługiwane, w przeciwnym razie może uczynić '<' and '>' opcjonalnym.Jeśli wymagana jest walidacja, można to zrobić za pomocą instrukcji warunkowych lub innych sprytnych konstrukcji :-). –

1

zastosowanie tego regex "?([^"]*)"?\s*([^\s][email protected]+)

grupa 1 zawiera Imię

grupa 2 zawiera email

+0

Dlaczego upadek? Jest blisko. – hpique

+0

+1 za skierowanie mnie we właściwym kierunku. – hpique

0

W ten sposób można uzyskać z lub bez nazwy, usuwając cytaty.

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