E-Mail Validierung und Extraktion mittels Regex

E-Mail Validierung und Extraktion mittels Regex

E-Mail Validierung und Extraktion mittels Regex

Das Durchsuchen von Strings nach bestimmten Stellen oder das Ersetzen durch Textteile ist eine Standardaufgabe, die immer wieder bewältigt werden muss. Die E-Mail Validierung mithilfe von Regular Expressions ist eine bewährte Methode, wenn zum Beispiel bei einen Registrierungsprozess die Richtigkeit der eingegeben E-Mail überprüft werden muss. Ein weiterer Anwendungsfall wäre die Extraktion einer oder mehreren E-Mail-Adressen aus einem Text oder Ähnlichem.

Regular Expressions

Reguläre Ausdrücke (Regular Expressions / Regex) sind ein Mittel um Zeichenfolgen in Texten beziehungsweise zu finden und Zeichenketten zu verarbeiten. Sie sind keine Java Eigenart, sondern auch in Betriebssystemen ( z.B.: UNIX) und anderen Programmiersprachen (z.B.: C#) zu finden. Unter einem Regex versteht man in Java einen String der sich an eine spezielle Syntax hält.

Die Validierung

Folgendes Regex Pattern wird in diesem Beispiel verwendet:

^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$

Diese Kombination bedeutet, dass eine E-Mail Adresse mit einem Wort (\w), also Groß- und Kleinbuchstaben Zahlen von 0 bis 9 bzw. mit einem Sonderzeichen nach dem Protokoll RFC 5322, anfangen muss und mindestens einmal vorkommen muss (+). Optional (*) gefolgt von einem Punkt und wieder mit Zeichen, wie Groß- und Kleinbuchstaben, Zahlen von 0 bis 9 und zuvor genannten Sonderzeichen. Danach muss ein “@” Symbol folgen. Schließlich folgt die Third- bzw. Second-Level Domain der E-Mail. Diese muss wieder Groß- und Kleinbuchstaben und Zahlen von 0 bis 9 beinhalten. Außerdem können an dieser Stelle ein oder mehrere Punkte befinden (+). Danach folgt die Top-Level-Domain, welche mindestens zwei Groß- oder Kleinbuchstaben beinhalten muss, maximal jedoch nur sechs.

Die Kombination aus Third-, Second- und Top-Level-Domain wird für Domains benötigt, welche zum Beispiel mit “mail.or.at“ oder “meine.adresse.at“ enden.

Die wichtigsten Abschnitte des Patterns werden hier noch genauer erklärt:

^        # Anfang der Zeile
[]+      # Darin abgebildete Zeichen müssen mindestens einmal vorkommen (+)
(        # Beginn der ersten Gruppe
[]+      # Darin abgebildete Zeichen müssen mindestens einmal vorkommen (+)
)*       # Ende der ersten Gruppe. Diese Gruppe ist optional (*)
@        # Ein "@" muss an dieser Stelle vorhanden sein
(        # Beginn der zweiten Gruppe
[]+      # Darin abgebildete Zeichen müssen mindestens einmal vorkommen (+)
)+       # Ende der zweiten Gruppe. Diese muss mindestens einmal vorkommen (+)
[]{2,6}  # Darin abgebildete Zeichen müssen mindestens zweimal vorkommen, maximal sechsmal
$        # Ende der Zeile

In Java wird das Pattern-Matching nun wie folgt angewendet:

package at.grid.blog.mail.validator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MailValidator {
    private static Matcher matcher;

    private static final Pattern pattern = Pattern.compile("^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$");

    public static boolean validate(final String strToValidate) {
        matcher = pattern.matcher(strToValidate);
        return matcher.matches();
    }
}

Am Besten testet man diese Klasse nun mit einem Unit-Test, um mögliche E-Mail Adressen zu überprüfen:

package at.grid.blog.mail.validator;

import org.junit.Assert;
import org.junit.Test;

public class ValidatorTest {

    static final String[] VALID_MAILS = { "grid@yahoo.com", "'grid-2015@yahoo.com", "grid.2015@yahoo.com", "grid666@mt2015.com",
            "grid-999@gridtec.at", "grid.9000@mail.or.at", "grid@3.com", "grid@gmx.com.com", "grid+123@yahoo.com", "grid-tec+2015@google-test.com" };

    static final String[] INVALID_MAILS = { "gridtec", "grid@.test.at", "grid-tec@gmx.a", "gridtec123@.de", ".my.grid123@.de.vu", ".gridg@tec.com",
            "grid()*@mt2012.com", "grid@%*.org", "grid..2015@gmail.com", "grid.@tec.at", "grid@grid@gmail.com", "grid@gmx.net.1a" };

    @Test
    public final void testValid() {
        System.out.println("Gültige E-Mail´s :");
        for (String temp : VALID_MAILS) {
            Assert.assertEquals(MailValidator.validate(temp), true);
            System.out.println(temp);
        }
    }

    @Test
    public final void testInvalid() {
        System.out.println("Ungültige E-Mail´s : ");
        for (String temp : INVALID_MAILS) {
            Assert.assertEquals(MailValidator.validate(temp), false);
            System.out.println(temp);
        }
    }
}

// Ausgabe
// Gültige E-Mail´s :
// grid@yahoo.com
// 'grid-2015@yahoo.com
// grid.2015@yahoo.com
// grid666@mt2015.com
// grid-999@gridtec.at
// grid.9000@mail.or.at
// grid@3.com
// grid@gmx.com.com
// grid+123@yahoo.com
// grid-tec+2015@google-test.com
//
// Ungültige E-Mail :
// gridtec
// grid@.test.at
// grid-tec@gmx.a
// gridtec123@.de
// .my.grid123@.de.vu
// .gridg@tec.com
// grid()*@mt2012.com
// grid@%*.org
// grid..2015@gmail.com
// grid.@tec.at
// grid@grid@gmail.com
// grid@gmx.net.1a

Die Extraktion

Um E-Mail-Adressen aus einem gegebenen String zu extrahieren, wird die zuvor vorstellte Klasse und deren Unit-Test leicht abgeändert.

Die zuvor verwendete Regex bleibt annähernd die Selbe:

[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}

Es muss lediglich das “^“ zu Beginn und das “$“ am Ende entfernt werden, da sich die gesuchten E-Mail Adressen nicht nur am Anfang oder am Ende des gegebenen Strings befinden müssen. Dabei werden alle Ergebnisse, welche mit dem Pattern übereinstimmen, einer Liste hinzugefügt:

package at.grid.blog.mail.extractor;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MailExtractor {

    private static final Pattern pattern = Pattern.compile("[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}");

    public static List<String> getMatchedValues(final String str) {
        final List<String> matchingValues = new ArrayList<String>();
        final Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            matchingValues.add(matcher.group());
        }
        return matchingValues;
    }
}

Auch diese Klasse lässt sich leicht mittels Unit-Test überprüfen.

package at.grid.blog.mail.extractor;

import org.junit.Assert;
import org.junit.Test;

public class ExtractorTest {

    static final String[] EXTRACTED_MAILS = { "grid@yahoo.com", "grid666@mt2015.com", "grid@gmx.com.com" };

    static final String[] NOT_EXTRACTED_MAILS = { "nonumy@eirmod", "Stet@clita", "Lorem@ipsum." };

    public String TestText() {
        return new String("Lorem ipsum dolor sit amet, consetetur grid@yahoo.com "
                + "elitr, sed diam nonumy@eirmod tempor invidunt ut grid666@mt2015.com labore et dolore magna aliquyam "
                + "erat, sed diam voluptua. At vero eos et accusam et grid@gmx.com.com justo duo dolores et ea rebum. Stet@clita "
                + "kasd gubergren, no sea takimata sanctus est Lorem@ipsum.");
    }

    @Test
    public final void testNotFound() {
        System.out.println("Nicht Gefundene E-Mail´s :");
        for (String temp : NOT_EXTRACTED_MAILS) {
            Assert.assertEquals(MailExtractor.getMatchedValues(TestText()).contains(temp), false);
            System.out.println(temp);
        }
    }

    @Test
    public final void testFound() {
        System.out.println("Gefundene E-Mail´s :");
        for (String temp : EXTRACTED_MAILS) {
            Assert.assertEquals(MailExtractor.getMatchedValues(TestText()).contains(temp), true);
            System.out.println(temp);
        }
    }
}

// Ausgabe
// Gültige E-Mail´s :
// grid@yahoo.com
// 'grid-2015@yahoo.com
// grid.2015@yahoo.com
// grid666@mt2015.com
// grid-999@gridtec.at
// grid.9000@mail.or.at
// grid@3.com
// grid@gmx.com.com
// grid+123@yahoo.com
// grid-tec+2015@google-test.com
//
// Ungültige E-Mail :
// gridtec
// grid@.test.at
// grid-tec@gmx.a
// gridtec123@.de
// .my.grid123@.de.vu
// .gridg@tec.com
// grid()*@mt2012.com
// grid@%*.org
// grid..2015@gmail.com
// grid.@tec.at
// grid@grid@gmail.com
// grid@gmx.net.1a

Quellen

Wikipedia Regular Expressions

Wikipedia Pattern Matching

Java RegEx

Wikipedia E-Mail

Tagged with:     , , ,

About the author /


Einst gelernter Werkzeugbautechniker, habe ich vor etlichen Jahren mein Leben der Informatik verschrieben. Zur Zeit studiere ich noch Informatik auf der Fachhochschule Technikum Wien und beschäftige mich am liebsten mit Java, Android und Elektronik.

Related Articles

Post your comments

Your email address will not be published. Required fields are marked *

*

Unterstütz uns!

Folgt uns!

Diese Seite

wurde erstellt mit Ehrgeiz, Liebe und viel Koffein. Bei der Erstellung kamen keine jar-Dateien zu Schaden. Das Logo wurde erstellt von Star-seven.at.