Regulärer Ausdruck, der einem Muster entspricht oder eine leere Zeichenfolge ist

84

Ich habe den folgenden regulären Ausdruck, der einem E-Mail-Adressformat entspricht:

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$

Dies wird zur Validierung mit einem Formular unter Verwendung von JavaScript verwendet. Dies ist jedoch ein optionales Feld. Wie kann ich diesen regulären Ausdruck ändern, um ihn an ein E-Mail-Adressformat oder eine leere Zeichenfolge anzupassen?

Aufgrund meines begrenzten Regex-Wissens denke ich, dass es \bmit einer leeren Zeichenfolge übereinstimmt und |"Oder" bedeutet. Deshalb habe ich Folgendes versucht, aber es hat nicht funktioniert:

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$|\b
Curt
quelle
5
Wenn Sie eine E-Mail validieren müssen , seien Sie so freizügig wie möglich. Sie werden überrascht sein, wie einfach es ist, echte, gültige und funktionierende E-Mail-Adressen mit hausgemachten regulären Ausdrücken zu übersehen. Ihre Regex schlägt beispielsweise bei diesen gültigen Adressen fehl: [email protected], [email protected], root @ localhost, [email protected].
Zano
Wenn Sie mit Zano einverstanden sind, werfen Sie einen Blick auf diese Regex ex-parrot.com/pdw/Mail-RFC822-Address.html
Anders
@Anders wow, das ist eine sehr komplexe Regex! Ich glaube, ich habe die Komplexität von Regex falsch eingeschätzt
Curt
4
Nein, ich denke, Sie haben die Komplexität der E-Mail-Validierung falsch eingeschätzt :-)
Zano

Antworten:

198

patternVerwenden Sie zum Abgleichen oder für eine leere Zeichenfolge

^$|pattern

Erläuterung

  • ^und $sind der Anfang und das Ende der Schnuranker.
  • |wird verwendet, um Alternativen zu bezeichnen, z this|that.

Verweise


Auf \b

\bin den meisten Geschmacksrichtungen ist ein "Wortgrenzen" -Anker. Es handelt sich um eine Übereinstimmung mit der Breite Null, dh um eine leere Zeichenfolge, die jedoch nur an bestimmten Stellen , nämlich an den Grenzen eines Wortes, mit diesen Zeichenfolgen übereinstimmt .

Das heißt, \bbefindet sich:

  • Zwischen aufeinanderfolgenden \wund \W(in beliebiger Reihenfolge):
    • dh zwischen einem Wortzeichen und einem Nichtwortzeichen
  • Zwischen ^und\w
    • dh am Anfang der Zeichenfolge, wenn es mit beginnt \w
  • Zwischen \wund$
    • dh am Ende der Zeichenfolge, wenn sie mit endet \w

Verweise


Bei Verwendung von Regex zum Abgleichen von E-Mail-Adressen

Dies ist je nach Spezifikation nicht trivial.

Verwandte Fragen

Polygenschmierstoffe
quelle
10

Eine Alternative wäre, Ihren regulären Ausdruck in nicht erfassende Klammern zu setzen. Machen Sie diesen Ausdruck dann optional, indem Sie das ?Qualifikationsmerkmal verwenden, das nach 0 (dh leeren Zeichenfolgen) oder 1 Instanzen der nicht erfassten Gruppe sucht.

Zum Beispiel:

/(?: some regexp )?/

In Ihrem Fall würde der reguläre Ausdruck ungefähr so ​​aussehen:

/^(?:[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+)?$/

Kein |"oder" Operator notwendig!

Hier ist die Mozilla-Dokumentation für die JavaScript-Syntax für reguläre Ausdrücke.

Jgonzalez731
quelle
8

Ich bin nicht sicher, warum Sie eine optionale E-Mail-Adresse überprüfen möchten, aber ich würde vorschlagen, dass Sie diese verwenden

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

Bedeutung

^$        empty string
|         or
^         beginning of string
[^@\s]+   any character but @ or whitespace
@         
[^@\s]+
$         end of string

Sie werden gefälschte E-Mails sowieso nicht stoppen und auf diese Weise werden Sie gültige Adressen nicht stoppen.

Zano
quelle
Wenn eine Adresse nicht in das Feld eingegeben wird, wird ein NULL-Wert in die Datenbank eingegeben, daher kann dies beim Versenden von Newslettern usw. behandelt werden. Ich weiß, dass dies falsche Adressen nicht aufhält und ich auch nicht Ich denke, das ist mit Regex überhaupt möglich, aber es wird zumindest menschliches Versagen minimieren
Curt
1
Ich habe auch Kunden, die dies häufig anfordern. Es ist wirklich nur, um Kunden davon abzuhalten, etwas Dummes zu tun, wie ihre Telefonnummer in das E-Mail-Feld einzugeben.
Kelly Gendron
Ich wollte nur nach einem leeren String suchen. ^ $ gearbeitet
Subhashi
1

\ b entspricht einer Wortgrenze. Ich denke, Sie können ^ $ für leere Zeichenfolge verwenden.

Pritaeas
quelle