Espressione regolare che corrisponde a un modello o è una stringa vuota


86

Ho la seguente espressione regolare che corrisponde al formato di un indirizzo e-mail:

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

Viene utilizzato per la convalida con un modulo che utilizza JavaScript. Tuttavia, questo è un campo facoltativo. Quindi come posso modificare questa regex in modo che corrisponda a un formato di indirizzo e-mail o una stringa vuota?

Dalla mia conoscenza limitata delle espressioni regolari, penso che \bcorrisponda a una stringa vuota e |significhi "O", quindi ho provato a fare quanto segue, ma non ha funzionato:

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

5
Se devi convalidare un'e-mail, sii il più permissivo possibile. Saresti sorpreso di quanto sia facile perdere indirizzi email reali, validi e funzionali con espressioni regolari fatte in casa. La tua regex, ad esempio, fallirà su questi indirizzi validi: joe_blow@foo.com, micro$oft@apple.com, root @ localhost, siegfried+roy@lasvegas.com.
Zano

D'accordo con Zano, dai un'occhiata a questa regex ex-parrot.com/pdw/Mail-RFC822-Address.html
Anders

@ Anders wow, questa è un'espressione regolare molto complessa! Penso di aver sottovalutato la complessità della regex
Curt

5
No, penso che tu abbia sottovalutato la complessità della convalida dell'email :-)
Zano

Risposte:


202

Per trovare una corrispondenza patterno una stringa vuota, usa

^$|pattern

Spiegazione

  • ^e $sono rispettivamente l'inizio e la fine delle ancore di stringa.
  • |è usato per denotare alternative, ad es this|that.

Riferimenti


Sopra \b

\bnella maggior parte dei casi il sapore è un'ancora di "confine di parola". È una corrispondenza di larghezza zero, cioè una stringa vuota, ma corrisponde solo a quelle stringhe in punti molto specifici , vale a dire ai confini di una parola.

Cioè, \bsi trova:

  • Tra consecutivi \we \W(entrambi gli ordini):
    • cioè tra un carattere di parola e un carattere non di parola
  • Tra ^e\w
    • cioè all'inizio della stringa se inizia con \w
  • Tra \we$
    • cioè alla fine della stringa se finisce con \w

Riferimenti


Sull'utilizzo di regex per abbinare gli indirizzi e-mail

Questo non è banale a seconda delle specifiche.

Domande correlate


10

Un'alternativa sarebbe inserire la tua espressione regolare tra parentesi non catturanti. Quindi rendi facoltativa quell'espressione usando il ?qualificatore, che cercherà 0 (cioè stringa vuota) o 1 istanze del gruppo non catturato.

Per esempio:

/(?: some regexp )?/

Nel tuo caso l'espressione regolare sarebbe simile a questa:

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

Nessun |operatore "or" necessario!

Ecco la documentazione di Mozilla per la sintassi JavaScript Regular Expression.


8

Non sono sicuro del motivo per cui vorresti convalidare un indirizzo email opzionale, ma ti suggerisco di usarlo

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

senso

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

Non fermerai comunque le email false e in questo modo non fermerai gli indirizzi validi.


Se un indirizzo non viene inserito nel campo, viene inserito un valore NULL nel database, quindi questo può essere risolto quando si tratta di inviare newsletter ecc. Apprezzo che questo non fermi gli indirizzi falsi, e non lo faccio penso che sia possibile con Regex, ma almeno minimizzerà l'errore umano
Curt

1
Anche i clienti lo richiedono frequentemente. È solo per impedire ai clienti di fare qualcosa di stupido come inserire il proprio numero di telefono nel campo dell'email.
Kelly Gendron

Volevo solo verificare la presenza di una stringa vuota. ^ $ lavorato
Subhashi

1

\ b corrisponde al confine di una parola. Penso che tu possa usare ^ $ per una stringa vuota.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.