Regex-Ausdrücke (Regular Expression) sind eine sehr praktische Sache, um einen Text mit einem bestimmten Muster innerhalb eines anderen Textes zu finden. Braucht man jedoch einen Regex-Ausdruck, um eine E-Mail-Adresse in einem Text zu finden, dann wird es schnell kompliziert, wo es nicht kompliziert sein muss. Bei meiner Recherche im Internet bin ich auf sehr viele Beispiele von Regex-Pattern gestoßen und lange Foren-Diskussionen über die verschiedenen Regex-Ausdrücke, um eine Mail-Adresse zu ermitteln. Leider haben die wenigsten davon in meinem Fall zu einem Match geführt, wo es einen Treffer hätte geben müssen, sodass ich schlussendlich dann doch mein eigenes Pattern zusammengebastelt habe.
In meinem konkreten Fall wollte ich mittels VBA-Makro eine automatische Antwort-E-Mail verfassen und bei weitergeleiteten E-Mails sollte der ursprüngliche Sender einer E-Mail ermittelt werden aus dem Mail-Text und danach sollte die ursprüngliche Mail als gelesen markiert werden und in einen anderen Ordner verschoben werden.
Regulärer Ausdruck, um E-Mail-Adresse zu ermitteln
Um die E-Mail-Adresse zu ermitteln, habe ich folgenden VBA-Code verwendet. Der Regex-Code lässt sich aber natürlich auch in jeder anderen Programmiersprache, wie C#, verwenden. Ggf. muss man nur paar Spezifika der jeweiligen Programmiersprache berücksichtigen.
Dim myRegex As Object
Dim results As Object
Dim match As Object
Set myRegex = New RegExp
myRegex.pattern = "[\w.-]*@[\w.-]*\.[\w]{2,6}"
myRegex.Global = True
Set results = myRegex.Execute(body)
For Each match In results
Debug.Print match.Value
If match.Value = "searched@mail.de" Then
'mache irgendetwas hier
Exit For
End If
Next
Der eigentliche reguläre Ausdruck besteht also aus:
[\w.-]*@[\w.-]*\.[\w]{2,6}
Zur Erläuterung:
Man erkennt deutlich das @-Zeichen. Davor steht der Ausdruck [\w.-]*. \w steht für beliebige Buchstaben, Unterstrich und beliebige Ziffern von 0-9. Außerdem wurde ein Punkt “.” und ein Bindestrich ergänzt. Das “*” Sternchen hinter den eckigen Klammern sagt aus, dass die vorgenannten Zeichen in einer beliebigen Anzahl auftreten können. Es folgt dann das @-Zeichen und nochmal derselbe Ausdruck, der jetzt für den Domainnamen steht. Der Domainname kann also auch aus beliebigen Buchstaben, Ziffern und auch Subdomains, getrennt durch einen Punkt, bestehen.
Danach folgt der Punkt, der die Top-Level-Domain (TLD) abgrenzt, also z.B. .de, .us, .com, .fr, .es. Da der Punkt selbst eine Bedutung im Regex hat, er steht für nahezu beliebige Zeichen, muss der Punkt mit Backslash geschrieben werden “\.”.
Und dann folgt der eigentliche Ausdruck für die Top-Level-Domain [\w]{2,6}. Dieser sagt aus, dass die Top-Level-Domain aus beliebigen Zeichen (Buchstaben, Ziffern, Unterstrich) bestehen darf und mindestens 2 Zeichen und maximal 6 Zeichen haben darf. Das lässt sich sicherlich noch etwas präziser gestalten, da mir keine TLD bekannt sind, die Ziffern enthalten und andererseits gibt es bereits TLD mit größer 6 Buchstaben, wie z.B. .example oder .hamburg. In den meisten Fällen leistet der oben genannte Ausdruck aber gute Arbeit.
Damit werden also alle Mail-Adressen erfasst, wie zum Beispiel
- erwin@ekiwi-blog.de
- erwin.mueller@ekiwi.de
- pergamont@berlin.museum
- funny_ow.1.outreach@gma1il.ffg.com
Nicht abgedeckt sind Mails mit Sonderzeichen oder sehr langen TLD. Wenn es sowas gibt, kann man den Regex-Ausdruck durch Ergänzung der Sonderzeichen oder Anpassung der maximalen Zeichenzahl der TLD entsprechend anpassen.
- jonny.doe+marry-ann@gmail.com
- John.O’Connor@gmail.ie
- “Daniel\ O’Miller”@googlemail.com
- toIPDomain@[1.2.3.4]