Freigeben über


Gewusst wie: Überprüfen, ob Zeichenfolgen ein gültiges E-Mail-Format aufweisen

Im Beispiel in diesem Artikel wird ein regulärer Ausdruck zur Überprüfung verwendet, ob eine Zeichenfolge ein gültiges E-Mail-Format aufweist.

Im Vergleich dazu, was tatsächlich als E-Mail-Adresse verwendet werden kann, ist dieser reguläre Ausdruck einfach. Die Verwendung eines regulären Ausdrucks zum Überprüfen einer E-Mail ist nützlich, um sicherzustellen, dass die Struktur einer E-Mail-Adresse korrekt ist. Das ist jedoch kein Ersatz für die Überprüfung, ob die E-Mail-Adresse tatsächlich vorhanden ist.

✔️ VERWENDEN SIE einen einfachen regulären Ausdruck, um die Struktur einer E-Mail-Adresse zu überprüfen.

✔️ SENDEN SIE eine Test-E-Mail an die von einem Benutzer Ihrer App angegebene Adresse.

❌ Verwenden Sie einen regulären Ausdruck NICHT als einzige Methode zum Überprüfen einer E-Mail-Adresse.

Wenn Sie versuchen, den perfekten regulären Ausdruck zum Überprüfen der korrekten Struktur einer E-Mail-Adresse zu erstellen, wird dieser Ausdruck so komplex, dass es äußerst schwierig wird, ihn zu debuggen oder zu verbessern. Reguläre Ausdrücke können nicht überprüfen, ob eine E-Mail-Adresse existiert, auch wenn sie richtig strukturiert ist. Die beste Möglichkeit, eine E-Mail-Adresse zu überprüfen, ist das Senden einer Test-E-Mail an diese Adresse.

Warnung

Übergeben Sie ein Timeout, wenn Sie System.Text.RegularExpressions zum Verarbeiten nicht vertrauenswürdiger Eingaben verwenden. Böswillige Benutzer können Eingaben für RegularExpressions bereitstellen, um einen Denial-of-Service-Angriff durchzuführen. ASP.NET Core-Framework-APIs, die RegularExpressions verwenden, übergeben ein Timeout.

Beispiel

Im Beispiel wird eine Methode IsValidEmail definiert, die true zurückgibt, wenn die Zeichenfolge eine gültige E-Mail-Adresse enthält, und false, wenn nicht. Sie führt jedoch keine weitere Aktion aus.

Um die Gültigkeit der E-Mail-Adresse zu überprüfen ruft die IsValidEmail -Methode die Regex.Replace(String, String, MatchEvaluator) -Methode mit dem regulären Ausdruck (@)(.+)$ auf, um den Domänennamen von der E-Mail-Adresse zu trennen. Der dritte Parameter ist ein MatchEvaluator -Delegat, der die Methode darstellt, die den gefundenen Text verarbeitet und ersetzt. Das Muster des regulären Ausdrucks wird wie folgt interpretiert:

Muster Beschreibung
(@) Das @ Zeichen wird als Übereinstimmung verwendet. Dieser Teil stellt die erste Erfassungsgruppe dar.
(.+) Ein- oder mehrmalige Übereinstimmung mit beliebigem Zeichen. Dieser Teil stellt die zweite Erfassungsgruppe dar.
$ Beendet die Suche am Ende der Zeichenfolge.

Der Domänenname wird zusammen mit dem @-Zeichen an die DomainMapper-Methode übergeben. Die Methode verwendet die IdnMapping-Klasse, um Unicode-Zeichen in ihre Punycode-Entsprechungen zu übersetzen, die außerhalb des 7-Bit-ASCII-Zeichenbereichs liegen. Darüber hinaus wird die Methode auch das invalid -Flag auf True fest, wenn die IdnMapping.GetAscii -Methode ein unzulässiges Zeichen im Domänennamen erkennt. Diese Methode gibt den Punycode-Domänennamen, der dem @ Zeichen vorangestellt ist, an die IsValidEmail -Methode zurück.

Tipp

Es wird empfohlen, dass Sie einen einfachen regulären Ausdruck mit dem Muster (@)(.+)$ verwenden, um die Domäne zu normalisieren und dann einen Wert zurückzugeben, der angibt, ob die Adresse die Überprüfung bestanden hat oder nicht. Im Beispiel in diesem Artikel werden jedoch Möglichkeiten beschrieben, wie Sie einen regulären Ausdruck zur weiteren Überprüfung der E-Mail-Adresse verwenden können. Unabhängig davon, wie Sie eine E-Mail-Adresse überprüfen, sollten Sie immer eine Test-E-Mail an die Adresse senden, um sicherzustellen, dass diese existiert.

Die IsValidEmail-Methode ruft dann die Regex.IsMatch(String, String)-Methode auf, um zu überprüfen, ob die Adresse dem Muster eines regulären Ausdrucks entspricht.

Die Methode IsValidEmail überprüft lediglich, ob das Format der E-Mail-Adresse gültig ist. Sie überprüft nicht, ob die E-Mail-Adresse existiert. Außerdem überprüft die Methode IsValidEmail nicht, ob es sich bei dem Domänennamen der obersten Ebene um einen gültigen Domänennamen handelt, der in der IANA Root Zone Database aufgeführt ist, was einen Suchvorgang erfordern würde.

using System;
using System.Globalization;
using System.Text.RegularExpressions;

namespace RegexExamples
{
    class RegexUtilities
    {
        public static bool IsValidEmail(string email)
        {
            if (string.IsNullOrWhiteSpace(email))
                return false;

            try
            {
                // Normalize the domain
                email = Regex.Replace(email, @"(@)(.+)$", DomainMapper,
                                      RegexOptions.None, TimeSpan.FromMilliseconds(200));

                // Examines the domain part of the email and normalizes it.
                string DomainMapper(Match match)
                {
                    // Use IdnMapping class to convert Unicode domain names.
                    var idn = new IdnMapping();

                    // Pull out and process domain name (throws ArgumentException on invalid)
                    string domainName = idn.GetAscii(match.Groups[2].Value);

                    return match.Groups[1].Value + domainName;
                }
            }
            catch (RegexMatchTimeoutException e)
            {
                return false;
            }
            catch (ArgumentException e)
            {
                return false;
            }

            try
            {
                return Regex.IsMatch(email,
                    @"^[^@\s]+@[^@\s]+\.[^@\s]+$",
                    RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
            }
            catch (RegexMatchTimeoutException)
            {
                return false;
            }
        }
    }
}
Imports System.Globalization
Imports System.Text.RegularExpressions

Public Class RegexUtilities
    Public Shared Function IsValidEmail(email As String) As Boolean

        If String.IsNullOrWhiteSpace(email) Then Return False

        ' Use IdnMapping class to convert Unicode domain names.
        Try
            'Examines the domain part of the email and normalizes it.
            Dim DomainMapper =
                Function(match As Match) As String

                    'Use IdnMapping class to convert Unicode domain names.
                    Dim idn = New IdnMapping

                    'Pull out and process domain name (throws ArgumentException on invalid)
                    Dim domainName As String = idn.GetAscii(match.Groups(2).Value)

                    Return match.Groups(1).Value & domainName

                End Function

            'Normalize the domain
            email = Regex.Replace(email, "(@)(.+)$", DomainMapper,
                                  RegexOptions.None, TimeSpan.FromMilliseconds(200))

        Catch e As RegexMatchTimeoutException
            Return False

        Catch e As ArgumentException
            Return False

        End Try

        Try
            Return Regex.IsMatch(email,
                                 "^[^@\s]+@[^@\s]+\.[^@\s]+$",
                                 RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250))

        Catch e As RegexMatchTimeoutException
            Return False

        End Try

    End Function
End Class

In diesem Beispiel kann das Muster des regulären Ausdrucks ^[^@\s]+@[^@\s]+\.[^@\s]+$ wie in der folgenden Tabelle dargestellt interpretiert werden. Der reguläre Ausdruck wird mit dem Flag RegexOptions.IgnoreCase kompiliert.

Muster BESCHREIBUNG
^ Starten Sie den Vergleich am Beginn der Zeichenfolge.
[^@\s]+ Überprüfung der einmaligen oder mehrmaligen Verwendung eines beliebigen Zeichens bis auf das @-Zeichen und das Leerzeichen
@ Das @ Zeichen wird als Übereinstimmung verwendet.
[^@\s]+ Überprüfung der einmaligen oder mehrmaligen Verwendung eines beliebigen Zeichens bis auf das @-Zeichen und das Leerzeichen
\. Überprüfung der Verwendung eines einzelnen Punkts
[^@\s]+ Überprüfung der einmaligen oder mehrmaligen Verwendung eines beliebigen Zeichens bis auf das @-Zeichen und das Leerzeichen
$ Beendet die Suche am Ende der Zeichenfolge.

Wichtig

Dieser reguläre Ausdruck soll nicht jeden Aspekt einer gültigen E-Mail-Adresse abdecken. Er wird vielmehr als Beispiel bereitgestellt, das Sie nach Bedarf erweitern können.

Siehe auch