2012-12-23 5 views
7

Was wären die regulären Ausdrücke, um den Namen und die E-Mail von Strings wie diesen zu extrahieren?Extrahieren Sie E-Mail und Name mit Regex

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

Es kann davon ausgegangen werden, dass die E-Mail gültig ist. Der Name wird durch die E-Mail durch ein einzelnes Leerzeichen getrennt und möglicherweise in Anführungszeichen gesetzt.

Die erwarteten Ergebnisse sind:

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

Das ist meine bisher erzielen Fortschritte:

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

(die hier getestet werden kann: http://regexr.com/?337i5)

+0

Was alle Möglichkeiten der gültige E-Mail haben Sie? Beachten Sie, dass Regex zur Validierung aller E-Mails sehr umfangreich sein kann. Sie müssen klären, welche E-Mails Sie für richtig halten. –

+0

Ich muss die E-Mail nicht validieren. – hpique

+0

Ihr Link funktioniert nicht. –

Antwort

12

Die folgende Regex an allen Eingängen zur Arbeit erscheint und verwendet nur zwei einfangende Gruppen:

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

http://regex101.com/r/dR8hL3

Dank @RohitJain und @burning_LEGION für die Einführung der Idee der nicht einfangenden Gruppen und Zeichenausschluss jeweils.

+0

funktionierte perfekt in meinem letzten js-Projekt (bisher) – electblake

0

Sie können versuchen, diesen (gleichen Code wie Sie, aber verbessert), aber Sie müssen zurückgegebene Gruppen nach dem Abgleich überprüfen, da die E-Mail entweder in Gruppe 2 oder Gruppe 3 zurückgegeben wird, abhängig davon, ob ein Name angegeben ist.

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

Gibt es keine Möglichkeit, es in der gleichen Erfassungsgruppe zu halten? – hpique

+0

@hpique: Hängt von Ihrer Sprache und Ihrem Regex-Geschmack ab. Es kann mit dem Konstrukt '(? | ...)' ausgeführt werden, falls dies unterstützt wird, andernfalls kann das '<' and '>' optional sein.Wenn eine Validierung erforderlich ist, kann dies mit bedingten Anweisungen oder einem anderen cleveren Konstrukt geschehen :-). –

1

Verwendung dieser regex "?([^"]*)"?\s*([^\s][email protected]+)

Gruppe 1 Name enthält

Gruppe 2 enthält E-Mail

+0

Warum der Downvote? Es ist ziemlich nah. – hpique

+0

+1 für mich in die richtige Richtung. – hpique

0

Auf diese Weise können Sie mit oder ohne Namen, entfernen Sie die Anführungszeichen.

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