Wyrażenie regularne, które pasuje do wzorca lub jest pustym łańcuchem

86

Mam następujące wyrażenie regularne, które pasuje do formatu adresu e-mail:

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

Służy do walidacji z formularzem przy użyciu JavaScript. Jest to jednak pole opcjonalne. W związku z tym, jak mogę zmienić to wyrażenie regularne, aby pasowało do formatu adresu e-mail lub pustego ciągu?

Z mojej ograniczonej wiedzy na temat wyrażeń regularnych wydaje mi się, że \bpasuje do pustego ciągu i |oznacza „lub”, więc próbowałem wykonać następujące czynności, ale nie zadziałało:

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$|\b
Lakoniczny
źródło
5
Jeśli musisz zweryfikować wiadomość e-mail, bądź tak liberalny, jak to tylko możliwe. Zdziwiłbyś się, jak łatwo jest przeoczyć prawdziwe, prawidłowe i funkcjonalne adresy e-mail za pomocą własnych wyrażeń regularnych. Na przykład Twoje wyrażenie regularne zawiedzie na tych prawidłowych adresach: [email protected], [email protected], root @ localhost, [email protected].
Zano,
Zgadzając się z Zano, spójrz tylko na to wyrażenie regularne ex-parrot.com/pdw/Mail-RFC822-Address.html
Anders
@Anders wow, to bardzo złożone wyrażenie regularne! Myślę, że źle oceniłem złożoność wyrażenia regularnego
Curt,
5
Nie, myślę, że źle oceniłeś złożoność weryfikacji adresu e-mail :-)
Zano,

Odpowiedzi:

202

Aby dopasować patternlub pusty ciąg, użyj

^$|pattern

Wyjaśnienie

  • ^i $są odpowiednio początkiem i końcem kotwic struny.
  • |jest używany do oznaczenia zamienników, np this|that.

Bibliografia


Na \b

\bw większości smaków jest kotwicą „granicy słów”. Jest to dopasowanie o zerowej szerokości, tj. Pusty ciąg, ale dopasowuje te ciągi tylko w bardzo określonych miejscach , a mianowicie na granicach słowa.

Oznacza to, że \bznajduje się:

  • Między kolejnymi \wa \W(w dowolnej kolejności):
    • tj. między znakiem słownym a znakiem niebędącym słowem
  • Między ^a\w
    • tj. na początku ciągu, jeśli zaczyna się od \w
  • Między \wa$
    • tj. na końcu łańcucha, jeśli kończy się na \w

Bibliografia


Używanie wyrażenia regularnego do dopasowywania adresów e-mail

Nie jest to trywialne w zależności od specyfikacji.

Powiązane pytania

smary wielogenowe
źródło
10

Alternatywą byłoby umieszczenie wyrażenia regularnego w nawiasach nieprzechwytywanych. Następnie ustaw to wyrażenie jako opcjonalne, używając ?kwalifikatora, który będzie szukał 0 (tj. Pustego ciągu) lub 1 wystąpienia grupy nieprzechwyconej.

Na przykład:

/(?: some regexp )?/

W twoim przypadku wyrażenie regularne wyglądałoby mniej więcej tak:

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

Nie jest |potrzebny operator „lub”!

Oto dokumentacja Mozilli dotycząca składni wyrażeń regularnych JavaScript.

Jgonzalez731
źródło
8

Nie jestem pewien, dlaczego chcesz zweryfikować opcjonalny adres e-mail, ale sugeruję użycie

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

znaczenie

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

I tak nie zatrzymasz fałszywych e-maili, a w ten sposób nie zatrzymasz prawidłowych adresów.

Zano
źródło
Jeśli adres nie jest wpisany w polu, do bazy danych jest wprowadzana wartość NULL, więc można sobie z tym poradzić, jeśli chodzi o wysyłanie biuletynów itp. Doceniam to, że nie zatrzyma to fałszywych adresów, a ja nie myślę, że jest to w ogóle możliwe z Regex, ale przynajmniej zminimalizuje ludzki błąd
Curt
1
Często też o to proszą klienci. Chodzi o to, aby klienci nie zrobili czegoś głupiego, na przykład wpisania swojego numeru telefonu w polu adresu e-mail.
Kelly Gendron
Chciałem tylko sprawdzić, czy jest pusty ciąg. ^ $ pracował
Subhashi
1

\ b dopasowuje granicę słowa. Myślę, że możesz użyć ^ $ dla pustego ciągu.

pritaeas
źródło