javascript - Reguljärt uttryck som matchar ett mönster, eller är en tom sträng


Jag har följande reguljära uttryck som matchar ett e-postadressformat:

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

Detta används för validering med ett formulär som använder JavaScript. Detta är dock ett valfritt område. Så hur kan jag ändra denna regex för att matcha ett e-postadressformat eller en tom sträng?

Utifrån min begränsade kunskap om regex tror jag att \b matchar en tom sträng, och | betyder "Eller", så jag försökte göra följande, men det fungerade inte:

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

Svar #1

För att matcha pattern eller en tom sträng, använd

^$|pattern

Förklaring

  • ^ och $ är början och slutet av strängankare respektive.
  • | används för att ange alternativ, t.ex. this|that.

Referenser

  • regular-expressions.info/Ankar och Alternering

På \b

\b i de flesta varianter är ett "ordgräns"-ankare. Det är en nollbreddsmatchning, dvs. en tom sträng, men den matchar bara dessa strängar på mycket specifika ställen, nämligen vid gränserna av ett ord.

Det vill säga, \b är placerad:

  • Mellan på varandra följande \w och \W (i vilken ordning som helst):

    • dvs. mellan ett ordtecken och ett icke-ordtecken
  • Mellan ^ och \w

    • d.v.s. i början av strängen om den börjar med \w
  • Mellan \w och $

    • d.v.s. i slutet av strängen om den slutar med \w

Referenser

  • regular-expressions.info/Word Boundaries

Om att använda regex för att matcha e-postadresser

Detta är inte trivialt beroende på specifikation.

Relaterade frågor

  • Vad är det bästa reguljära uttrycket för att validera e-postadresser?
  • Är regexp-igenkänning av e-postadress svårt?
  • Hur långt bör man gå med validering av e-postadress?

Svar #2

Ett alternativ skulle vara att placera ditt regexp i icke-fångande parenteser. Gör sedan det uttrycket valfritt med hjälp av ?-kvalifikatorn, vilket kommer att söka efter 0 (dvs. tom sträng) eller 1 förekomst av den icke-fångade gruppen.

Till exempel:

/(?: some regexp )?/

I ditt fall skulle det reguljära uttrycket se ut ungefär så här:

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

Ingen | "eller" operator nödvändig!

Här är Mozillas dokumentation för JavaScript-reguljära uttrycks syntax.

Svar #3

Jag är inte säker på varför du skulle vilja validera en valfri e-postadress, men jag skulle föreslå att du använder

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

mening

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

Du kommer ändå inte stoppa falska e-postmeddelanden, och på det här sättet kommer du inte stoppa giltiga adresser.

Relaterade artiklar