2012-12-23 25 views
7

Quali sarebbero le espressioni regolari per estrarre il nome e l'e-mail da stringhe come queste?Estrai email e nome con regex

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

Si può presumere che l'e-mail sia valida. Il nome sarà separato dall'e-mail da un singolo spazio e potrebbe essere citato.

I risultati attesi sono:

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

Questo è il mio progresso finora:

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

(che può essere testato qui: http://regexr.com/?337i5)

+0

Che tutti possiblities di e-mail valido si è verificato? Si noti che regex per la convalida di tutte le e-mail può essere vasto. Devi chiarire che cosa tutte le email stai considerando come corrette. –

+0

Non è necessario convalidare l'e-mail. – hpique

+0

Il tuo link non funziona. –

risposta

12

La seguente espressione regolare sembra funzionare su tutti gli ingressi e utilizza solo due gruppi di cattura:

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

http://regex101.com/r/dR8hL3

Grazie a @RohitJain e @burning_LEGION per l'introduzione rispettivamente dell'idea di gruppi non di cattura e di esclusione caratteri.

+0

ha funzionato perfettamente nel mio ultimo progetto js (finora) – electblake

0

si può provare questo (stesso codice come la vostra ma migliorata), ma è necessario controllare i gruppi restituiti dopo la corrispondenza perché l'e-mail viene restituita nel gruppo 2 o nel gruppo 3, a seconda che venga fornito un nome.

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

Non c'è modo di mantenerlo nello stesso gruppo di cattura? – hpique

+0

@hpique: dipende dalla lingua e dal sapore regex. Può essere fatto usando il costrutto '(? | ...)' se supportato, altrimenti forse rendendo '<' and '>' opzionale.Se è richiesta la convalida, questo può essere fatto usando istruzioni condizionali o qualsiasi altro costrutto intelligente :-). –

1

uso questa espressione regolare "?([^"]*)"?\s*([^\s][email protected]+)

gruppo 1 contiene il nome

gruppo 2 contiene e-mail

+0

Perché il downvote? È abbastanza vicino – hpique

+0

+1 per avermi indicato nella giusta direzione. – hpique

0

In questo modo è possibile ottenere con o senza nome, rimuovendo le virgolette.

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