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
\woch\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.
