Was ist der einfachste reguläre Ausdruck, um E-Mails so zu validieren, dass sie nicht blind akzeptiert werden? [geschlossen]


80

Wenn Benutzer auf meiner Website ein Konto erstellen, möchte ich eine Serverüberprüfung durchführen, damit E-Mails nicht jede Eingabe akzeptieren .

Ich werde eine Bestätigung senden, um eine Handshake-Validierung durchzuführen .

Ich suche etwas Einfaches, nicht das Beste , aber nicht zu Einfaches, das nichts bestätigt. Ich weiß nicht, wo die Einschränkung sein muss, da reguläre Ausdrücke nicht die richtige Validierung durchführen, da dies mit regulären Ausdrücken nicht möglich ist.

Ich versuche, die mit regulären Ausdrücken verbundene Sintax und visuelle Komplexität zu begrenzen, da in diesem Fall alle korrekt sind.

Mit welchem ​​regulären Ausdruck kann ich das tun?


Der Gedanke "am einfachsten" war genau so subjektiv wie "am besten", ceteris paribus, und dieser Thread hatte ein Füllhorn an Regexen, aber wenn Sie so denken ... Achselzucken
Mihai Limbășan

Wenn Sie eine Regex-Validierung durchführen, warum sollten Sie den Ausdruck auf etwas Einfaches beschränken? Verwenden wir etwas Gutes. Dies hat keine Auswirkungen auf Ihren Code und liefert bessere Ergebnisse.
Twk

Wo in Ihrer Bewerbung wäre diese Validierung? Auf POST? Was tun Sie, um Eingaben zu bereinigen?
Braiam

^ (? i) [A-Z0-9 + _.-] + @ (?:. *). (?:. *) $, ^ bezeichnet Start, $ bezeichnet Ende, (? i) Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung. vor @ nur alphanumerisch zulassen, '+', '_', '-'. dieses,?: für keine teilweise Match-Untergruppenbildung, nur 1 vollständiges Match
P Satish Patro

Antworten:


98
^\S+@\S+$

3
Dies entspricht ungültigen Adressen. Jeder reguläre Ausdruck wird verwendet, aber dieser entspricht häufig verwendeten Rechtschreibfehlern wie test @ stackoverflow..com (beachten Sie die doppelten Punkte). Bitte geben Sie ein besseres Beispiel an.
Mihai Limbășan

61
Es soll ein maximal einfacher, sehr grober Filter sein, und ich verstehe nicht, warum doppelte Perioden gegenüber allen anderen Fehlern mit ähnlichen Komplexitätskosten bevorzugt werden, um sie abzudecken.
Chaos

2
+1. Dies ist sowieso eine subjektive Frage, und das ist einfach.
Jason Cohen

2
Ja, wenn Sie nicht den vollständigen validierenden
regulären Ausdruck verwenden

8
+1 Der Versuch, eine E-Mail-Adresse vollständig über Regex zu „validieren“, ist ein Kinderspiel. Dies funktioniert, um die einfachsten Fehlertypen zu erkennen. Der Rest kann gefunden werden, indem versucht wird, die Mail zu senden. Das oben Gesagte erlaubt auch Unicode-Domänen (-> Punycode), bei denen die meisten „cleveren“ regulären Ausdrücke fehlschlagen.
Bobince

235

Es ist möglich, einen regulären Ausdruck zu schreiben, der nur E-Mail-Adressen akzeptiert, die den Standards entsprechen. Es gibt jedoch einige E-Mail-Adressen, die nicht genau den Standards entsprechen, aber dennoch funktionieren.

Hier sind einige einfache reguläre Ausdrücke für die grundlegende Validierung:

Enthält ein @ -Zeichen:

@

Enthält @ und einen Punkt irgendwo danach:

@.*?\.

Hat mindestens ein Zeichen vor dem @, vor dem Punkt und danach:

.+@.+\..+

Hat nur ein @, mindestens ein Zeichen vor dem @, vor dem Punkt und danach:

^[^@]+@[^@]+\.[^@]+$

Benutzer AmoebaMan17 schlägt diese Änderung vor, um Leerzeichen zu entfernen:

^[^@\s]+@[^@\s]+\.[^@\s]+$

Und für die Annahme nur einer Periode:

^[^@\s]+@[^@\s\.]+\.[^@\.\s]+$

7
Wenn Sie sich ansehen, was mit RFC 6531 auf dem Spiel steht, und wenn Sie sich RFC 3696 genau ansehen, werden Sie wahrscheinlich zu dem Schluss kommen, dass die einzige Möglichkeit, eine E-Mail zu validieren, darin besteht, eine Bestätigungs-E-Mail zu senden. Ich denke, der eigentliche Fokus bei der Verwendung von Regex für E-Mail-Adressen sollte darauf liegen, dem Benutzer zu helfen, Tippfehler zu vermeiden, und hier kommen einfache Regex wie diese ins Spiel.
Bob Barker

Perfekt, @ AmoebaMan17. RegEx kann das Format der E-Mail-Adresse und den Inhalt der E- Mail-Adresse nicht überprüfen . Das heißt, Ihre validiert das Format vollständig. Das Senden der E-Mail ist die einzige Möglichkeit, den Inhalt zu überprüfen.
Craig

wird nicht arbeiten test@test.com?
Abdul Hameed

1
Um zu verhindern, dass die Zeichenfolge mit einem Punkt endet, habe ich folgende Änderung vorgenommen: ^ [^ @ \ s] + @ [^ @ \ s] + \. [^ @ \. \ S] + $
Fyrite

1
Ja, benutze nicht den letzten. Es stimmt nicht mit vielen gültigen Optionen überein. me@provider.co.uk zum Beispiel.
Uhr

6

^ [a-zA-Z0-9 _. + -] + @ [a-zA-Z0-9 -] +. [a-zA-Z0-9 -.] + $

  • Nur 1 @
  • Mehrere Domains und Subdomains

3

Ich denke, diese kleine Änderung des Ausdrucks von AmoebaMan17 sollte verhindern, dass die Adresse mit einem Punkt beginnt / endet, und auch mehrere Punkte nebeneinander stoppen. Versuchen Sie, es nicht wieder komplex zu machen, während Sie ein häufiges Problem beseitigen.

(?!.*\.\.)(^[^\.][^@\s]+@[^@\s]+\.[^@\s\.]+$)

Es scheint zu funktionieren (aber ich bin kein RegEx-Pert). Behebt mein Problem mit dem Kopieren und Einfügen von E-Mail-Adressen durch Benutzer am Ende von Sätzen, die mit einem Punkt enden.

dh: Hier ist meine neue E-Mail-Adresse tabby@coolforcats.com.


Dies funktioniert nicht für einen einzelnen Charakter vor dem @
Andy Hoyle

<script> alert ('hello') </ script> @ hello.com ist gemäß dieser Regex gültig. Scheint nicht in Ordnung zu sein.
Dudedev

1

Treffen Sie Ihre Wahl.

Hier ist derjenige, der RFC 2822 Abschnitt 3.4.1 entspricht ...

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

Nur für den Fall, dass Sie neugierig sind. :) :)


7
Nur ein Hinweis für alle, die dies jetzt sehen: Das entspricht nicht RFC 2822.
Porges

11
Und es ist auch nicht einfach :)
Dan Diplo

2
Es wird auch eine Vielzahl gültiger E-Mail-Adressen blockiert. Besonders solche, die internationale Zeichen / Sprachen verwenden.
Bob Barker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.