4146 Stimmen

Wie kann ich eine E-Mail-Adresse mithilfe eines regulären Ausdrucks überprüfen?

Im Laufe der Jahre habe ich langsam eine regulärer Ausdruck die die Gültigkeit Die meisten E-Mail-Adressen korrekt, vorausgesetzt, sie verwenden keine IP-Adresse als Serverteil.

Ich verwende es in mehreren PHP-Programmen, und es funktioniert die meiste Zeit. Von Zeit zu Zeit werde ich jedoch von jemandem kontaktiert, der Probleme mit einer Website hat, die es verwendet, und ich muss dann einige Anpassungen vornehmen (vor kurzem habe ich festgestellt, dass ich keine vierstelligen Buchstaben zulasse TLDs ).

Was ist der beste reguläre Ausdruck, den Sie haben oder gesehen haben, um E-Mails zu validieren?

Ich habe mehrere Lösungen gesehen, die Funktionen verwenden, die mehrere kürzere Ausdrücke verwenden, aber ich hätte lieber einen langen komplexen Ausdruck in einer einfachen Funktion als mehrere kurze Ausdrücke in einer komplexeren Funktion.

10 Stimmen

Der Regex, der überprüfen kann, ob eine IDNA korrekt formatiert ist, passt nicht in Stackexchange. (die Regeln für die Kanonisierung sind sehr umständlich und eignen sich besonders schlecht für die Regex-Verarbeitung)

13 Stimmen

0 Stimmen

Die Regexe können sein variabel denn in manchen Fällen kann eine E-Mail ein Leerzeichen enthalten, in anderen Fällen darf sie keine Leerzeichen enthalten.

4voto

Suhaib Janjua Punkte 3432

Ich verwende immer den unten stehenden regulären Ausdruck, um die E-Mail-Adresse zu überprüfen. Er deckt alle Formate von E-Mail-Adressen ab, die auf englischsprachigen Zeichen basieren.

"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z";

Im Folgenden finden Sie ein C#-Beispiel:

Fügen Sie die Baugruppenreferenz hinzu:

using System.Text.RegularExpressions;

und verwenden Sie die folgende Methode, um die E-Mail-Adresse zu übergeben und einen booleschen Wert zu erhalten

private bool IsValidEmail(string email) {
    bool isValid = false;
    const string pattern = @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z";

    isValid = email != "" && Regex.IsMatch(email, pattern);

    // Same above approach in multiple lines
    //
    //if (!email) {
    //    isValid = false;
    //} else {
    //    // email param contains a value; Pass it to the isMatch method
    //    isValid = Regex.IsMatch(email, pattern);
    //}
    return isValid;
}

Diese Methode validiert die im Parameter übergebene E-Mail-Zeichenkette. Sie gibt false zurück, wenn der Parameter null, ein leerer String oder undefiniert ist oder wenn der Parameterwert keine gültige E-Mail-Adresse ist. Sie gibt nur true zurück, wenn der Parameter eine gültige E-Mail-Adresse enthält.

2 Stimmen

Akzeptiert dieser Code "Håkan.Söderström@malmö.se" oder "@..." Emails?

3 Stimmen

Es ist für Standard-E-Mail-Server mit Standardzeichen. Im Falle von nicht englischer Sprache sollte man seine eigene angepasste ReGex machen müssen.

0 Stimmen

Die Regex- und E-Mail-Spezifikation enthält UTF-8, daher die unlogische Antwort.

3voto

Hans-Peter Störr Punkte 24030

Ich würde nicht vorschlagen, überhaupt eine Regex zu verwenden - E-Mail-Adressen sind dafür viel zu kompliziert. Dies ist ein häufiges Problem, daher würde ich vermuten, dass es viele Bibliotheken gibt, die einen Validator enthalten - wenn Sie Java verwenden, ist die EmailValidator de apache commons validator ist ein gutes Beispiel.

3voto

FLY Punkte 2181

Hier ist die, die ich gebaut habe. Es ist keine kugelsichere Version, aber sie ist "einfach" und überprüft fast alles.

[\w+-]+(?:\.[\w+-]+)*@[\w+-]+(?:\.[\w+-]+)*(?:\.[a-zA-Z]{2,4})

Ich denke, es gibt eine Erklärung, die Sie ändern können, wenn Sie wollen:

( e ) [\w+-]+ passt auf a-z, A-Z, _, +, - mindestens ein Mal

( m ) (?:\.[\w+-]+)* entspricht a-z, A-Z, _, +, - null oder mehr Mal, muss aber mit einem . (Punkt) beginnen

@ = @

( i ) [\w+-]+ passt auf a-z, A-Z, _, +, - mindestens ein Mal

( l ) (?:\.[\w+-]+)* entspricht a-z, A-Z, _, +, - null oder mehr Mal, muss aber mit einem . (Punkt) beginnen

( com ) (?:\.[a-zA-Z]{2,4}) entspricht a-z, A-Z für 2 bis 4 Mal beginnend mit einem . (Punkt)

Geben e(.m)@i(.l).com wobei (.m) y (.l) sind optional, können aber auch mehrfach wiederholt werden.

Ich denke, dass dies alle gültigen E-Mail-Adressen validiert, aber potenziell ungültige blockiert, ohne einen überkomplexen regulären Ausdruck zu verwenden, was in den meisten Fällen nicht notwendig sein wird.

Beachten Sie, dass dies Folgendes ermöglicht +@-.com aber das ist der Kompromiss, um es einfach zu halten.

0 Stimmen

Danke! Das hat bei mir funktioniert. Hier ist eine getestete C/C++ entkommene Version, die mit Qt5 verwendet wird: QRegExp rx("[ \\w +-]+(?: \\. [ \\w +-]+)*@[ \\w +-]+(?: \\. [ \\w +-]+)*(?: \\. [a-zA-Z]{2,})");

3voto

Alexey Ossikine Punkte 103

Wenn Sie eine Regex verbessern wollen, die über mehrere Jahre hinweg recht gut funktioniert hat, hängt die Antwort davon ab, was genau Sie erreichen wollen - welche Arten von E-Mail-Adressen fehlgeschlagen sind. Die Feinabstimmung von E-Mail-Regexen ist sehr schwierig, und ich habe noch keine perfekte Lösung gesehen.

  • Wenn Ihre Anwendung etwas sehr Technisches beinhaltet (oder etwas Organisationsinternes), dann müssen Sie vielleicht IP-Adressen anstelle von Domänennamen oder Kommentare im "lokalen" Teil der E-Mail-Adresse unterstützen.
  • Wenn Ihre Bewerbung multinational ist, würde ich mich auf folgende Punkte konzentrieren Unicode y UTF-8 Unterstützung.

Die führende Antwort auf Ihre Frage verweist derzeit auf eine "vollständig RFC822-konforme Regex". Trotz der Komplexität dieser Regex und ihrer vermeintlichen Detailtreue bei den RFC-Regeln versagt sie jedoch völlig, wenn es um die Unterstützung von Unicode geht.

Die Regex, die ich für die meisten meiner Anwendungen geschrieben habe, konzentriert sich auf Unicode-Unterstützung sowie auf einigermaßen insgesamt gute Einhaltung der RFC-Standards:

/^(?!\.)((?!.*\.{2})[a-zA-Z0-9\u0080-\u00FF\u0100-\u017F\u0180-\u024F\u0250-\u02AF\u0300-\u036F\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u0530-\u058F\u0590-\u05FF\u0600-\u06FF\u0700-\u074F\u0750-\u077F\u0780-\u07BF\u07C0-\u07FF\u0900-\u097F\u0980-\u09FF\u0A00-\u0A7F\u0A80-\u0AFF\u0B00-\u0B7F\u0B80-\u0BFF\u0C00-\u0C7F\u0C80-\u0CFF\u0D00-\u0D7F\u0D80-\u0DFF\u0E00-\u0E7F\u0E80-\u0EFF\u0F00-\u0FFF\u1000-\u109F\u10A0-\u10FF\u1100-\u11FF\u1200-\u137F\u1380-\u139F\u13A0-\u13FF\u1400-\u167F\u1680-\u169F\u16A0-\u16FF\u1700-\u171F\u1720-\u173F\u1740-\u175F\u1760-\u177F\u1780-\u17FF\u1800-\u18AF\u1900-\u194F\u1950-\u197F\u1980-\u19DF\u19E0-\u19FF\u1A00-\u1A1F\u1B00-\u1B7F\u1D00-\u1D7F\u1D80-\u1DBF\u1DC0-\u1DFF\u1E00-\u1EFF\u1F00-\u1FFFu20D0-\u20FF\u2100-\u214F\u2C00-\u2C5F\u2C60-\u2C7F\u2C80-\u2CFF\u2D00-\u2D2F\u2D30-\u2D7F\u2D80-\u2DDF\u2F00-\u2FDF\u2FF0-\u2FFF\u3040-\u309F\u30A0-\u30FF\u3100-\u312F\u3130-\u318F\u3190-\u319F\u31C0-\u31EF\u31F0-\u31FF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FFF\uA000-\uA48F\uA490-\uA4CF\uA700-\uA71F\uA800-\uA82F\uA840-\uA87F\uAC00-\uD7AF\uF900-\uFAFF\.!#$%&'*+-/=?^_`{|}~\-\d]+)@(?!\.)([a-zA-Z0-9\u0080-\u00FF\u0100-\u017F\u0180-\u024F\u0250-\u02AF\u0300-\u036F\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u0530-\u058F\u0590-\u05FF\u0600-\u06FF\u0700-\u074F\u0750-\u077F\u0780-\u07BF\u07C0-\u07FF\u0900-\u097F\u0980-\u09FF\u0A00-\u0A7F\u0A80-\u0AFF\u0B00-\u0B7F\u0B80-\u0BFF\u0C00-\u0C7F\u0C80-\u0CFF\u0D00-\u0D7F\u0D80-\u0DFF\u0E00-\u0E7F\u0E80-\u0EFF\u0F00-\u0FFF\u1000-\u109F\u10A0-\u10FF\u1100-\u11FF\u1200-\u137F\u1380-\u139F\u13A0-\u13FF\u1400-\u167F\u1680-\u169F\u16A0-\u16FF\u1700-\u171F\u1720-\u173F\u1740-\u175F\u1760-\u177F\u1780-\u17FF\u1800-\u18AF\u1900-\u194F\u1950-\u197F\u1980-\u19DF\u19E0-\u19FF\u1A00-\u1A1F\u1B00-\u1B7F\u1D00-\u1D7F\u1D80-\u1DBF\u1DC0-\u1DFF\u1E00-\u1EFF\u1F00-\u1FFF\u20D0-\u20FF\u2100-\u214F\u2C00-\u2C5F\u2C60-\u2C7F\u2C80-\u2CFF\u2D00-\u2D2F\u2D30-\u2D7F\u2D80-\u2DDF\u2F00-\u2FDF\u2FF0-\u2FFF\u3040-\u309F\u30A0-\u30FF\u3100-\u312F\u3130-\u318F\u3190-\u319F\u31C0-\u31EF\u31F0-\u31FF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FFF\uA000-\uA48F\uA490-\uA4CF\uA700-\uA71F\uA800-\uA82F\uA840-\uA87F\uAC00-\uD7AF\uF900-\uFAFF\-\.\d]+)((\.([a-zA-Z\u0080-\u00FF\u0100-\u017F\u0180-\u024F\u0250-\u02AF\u0300-\u036F\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u0530-\u058F\u0590-\u05FF\u0600-\u06FF\u0700-\u074F\u0750-\u077F\u0780-\u07BF\u07C0-\u07FF\u0900-\u097F\u0980-\u09FF\u0A00-\u0A7F\u0A80-\u0AFF\u0B00-\u0B7F\u0B80-\u0BFF\u0C00-\u0C7F\u0C80-\u0CFF\u0D00-\u0D7F\u0D80-\u0DFF\u0E00-\u0E7F\u0E80-\u0EFF\u0F00-\u0FFF\u1000-\u109F\u10A0-\u10FF\u1100-\u11FF\u1200-\u137F\u1380-\u139F\u13A0-\u13FF\u1400-\u167F\u1680-\u169F\u16A0-\u16FF\u1700-\u171F\u1720-\u173F\u1740-\u175F\u1760-\u177F\u1780-\u17FF\u1800-\u18AF\u1900-\u194F\u1950-\u197F\u1980-\u19DF\u19E0-\u19FF\u1A00-\u1A1F\u1B00-\u1B7F\u1D00-\u1D7F\u1D80-\u1DBF\u1DC0-\u1DFF\u1E00-\u1EFF\u1F00-\u1FFF\u20D0-\u20FF\u2100-\u214F\u2C00-\u2C5F\u2C60-\u2C7F\u2C80-\u2CFF\u2D00-\u2D2F\u2D30-\u2D7F\u2D80-\u2DDF\u2F00-\u2FDF\u2FF0-\u2FFF\u3040-\u309F\u30A0-\u30FF\u3100-\u312F\u3130-\u318F\u3190-\u319F\u31C0-\u31EF\u31F0-\u31FF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FFF\uA000-\uA48F\uA490-\uA4CF\uA700-\uA71F\uA800-\uA82F\uA840-\uA87F\uAC00-\uD7AF\uF900-\uFAFF]){2,63})+)$/i

Ich werde es vermeiden, vollständige Antworten zu kopieren, und verweise daher einfach auf eine ähnliche Antwort, die ich hier gegeben habe: Wie validiere ich eine Unicode-E-Mail?

Es gibt auch eine Live-Demo für die obige Regex unter: http://jsfiddle.net/aossikine/qCLVH/3/

3voto

mirabilos Punkte 4738

Ich hatte einen ähnlichen Wunsch: Ich wollte eine schnelle Überprüfung der Syntax von E-Mail-Adressen, ohne dabei zu übertreiben (die Mail::RFC822::Address Antwort, die offensichtlich die richtige ist) für ein Dienstprogramm zum Senden von E-Mails . Ich ging mit diesem (ich bin ein POSIX reguläre Ausdrücke, daher verwende ich normalerweise keine \d und solche aus PCRE da sie für mich weniger lesbar sind):

preg_match("_^[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*@[0-9A-Za-z]([-0-9A-Za-z]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([-0-9A-Za-z]{0,61}[0-9A-Za-z])?)*\$_", $adr)

Das ist RFC-korrekt, aber es schließt explizit die veralteten Formen sowie direkte IP-Adressen (sowohl IP-Adressen als auch alte IP-Adressen) aus, die jemand aus der Zielgruppe dieses Dienstprogramms (meistens: Leute, die uns in #sendmail auf IRC ) in der Regel nicht wünschen oder benötigen würden.

IDNs (internationalisierte Domänennamen) sind ausdrücklich no im Bereich der E-Mail: Adressen wie "foo@cäcilienchor-bonn.de" muss stattdessen "foo@xn--ccilienchor-bonn-vnb.de" auf das Kabel geschrieben werden (dies gilt auch für mailto: Links in HTML und dergleichen), darf nur die grafische Benutzeroberfläche solche Namen dem Benutzer anzeigen (und dann akzeptieren und umwandeln).

0 Stimmen

Re "alte IP-Adressen" : Meinen Sie IPv4 IP-Adressen ?

0 Stimmen

@PeterMortensen: (danke für die Syntaxhervorhebung und die englischen Korrekturen, aber irgendetwas scheint jetzt kaputt zu sein, es heißt Community-Wiki mit Ihnen als Autor?) ja, Legacy-IP-Adressen sind das, was IPv4-Adressen seit ein paar Jahren genannt werden, IP-Adressen sind IPv6-Adressen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X