RegEx per assicurarsi che la stringa contenga almeno un carattere minuscolo, un carattere maiuscolo, una cifra e un simbolo


156

Qual è la regex per assicurarsi che una determinata stringa contenga almeno un carattere di ciascuna delle seguenti categorie.

  • Carattere minuscolo
  • Carattere maiuscolo
  • cifra
  • Simbolo

So che i modelli per singoli set vale a dire [a-z], [A-Z], \de _|[^\w](ho ottenuto li correggono, no?).

Ma come li combino per assicurarmi che la stringa contenga tutti questi in qualsiasi ordine?


Quale piattaforma / regex-dialect? La risposta di Bart è giusta, ma le affermazioni di lookahead non sono affidabili in JavaScript, per esempio.
Bobince,

Da nessuna parte in particolare - sto imparando regex. Esiste un'alternativa che può essere utilizzata in JavaScript?
Amarghosh,

@bobince Ehi, sto cercando di scoprire perché le asserzioni lookahead non sono affidabili in Javascript. C'è un commento su questo?
Chris Bier,

@ChrisB: C'è davvero un confuso bug di IE / JScript: blog.stevenlevithan.com/archives/regex-lookahead-bug
bobince

Risposte:


349

Se hai bisogno di un unico regex, prova:

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)

Una breve spiegazione:

(?=.*[a-z])        // use positive look ahead to see if at least one lower case letter exists
(?=.*[A-Z])        // use positive look ahead to see if at least one upper case letter exists
(?=.*\d)           // use positive look ahead to see if at least one digit exists
(?=.*\W])        // use positive look ahead to see if at least one non-word character exists

E sono d'accordo con SilentGhost, \Wpotrebbe essere un po 'ampio. Lo sostituirei con un set di caratteri come questo: [-+_!@#$%^&*.,?](sentiti libero di aggiungere altro ovviamente!)


Cosa accadrebbe se cambio l'ultimo .+in .*? Non sono riuscito a trovare un caso di test che non ha funzionato .*. Sono uguali in questo contesto? "Zero o più personaggi" sembra andare bene, sto solo cercando conferma.
Amarghosh,

@Amarghosh: in questo caso, non fa differenza. A causa delle previsioni positive, la stringa contiene già almeno 4 caratteri. Quindi non fa alcuna differenza per il cambiamento .+in .*o anche .{4,}per quella materia.
Bart Kiers,

Se vuoi aggiungere una piccola spiegazione, ho difficoltà a capire come la combinazione di questi lookaheads garantirà la presenza di almeno 1 di ogni set di caratteri
Sharlike,

@Sharlike, non so come riformularlo per renderlo più facile da capire. Soprattutto in queste piccole caselle di commento. Ti consiglio di leggere questo: regular-expressions.info/lookaround.html e se hai ancora domande, pubblica semplicemente una tua domanda. In bocca al lupo!
Bart Kiers,

4
@ikertxu, prova qualcosa del genere:^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?!.*[&%$]).{6,}$
Bart Kiers,

20

Bart Kiers, il tuo regex ha un paio di problemi. Il modo migliore per farlo è questo:

(.*[a-z].*)       // For lower cases
(.*[A-Z].*)       // For upper cases
(.*\d.*)          // For digits

In questo modo stai cercando, non importa se all'inizio, alla fine o al centro. Nel tuo ho molti problemi con password complesse.


5
Non stai verificando la presenza di simboli come richiesto dall'OP.
Casimir

5

Puoi abbinare questi tre gruppi separatamente e assicurarti che siano tutti presenti. Inoltre, [^\w]sembra un po 'troppo ampio, ma se è quello che vuoi, potresti volerlo sostituire \W.


Grazie. Non ero a conoscenza di \ W. Ho appena cercato per scoprire che corrisponde a Not Word. C'è qualche differenza tra \ W e [\ W]? [\ W] è solo ridondante?
Amarghosh,

@Amarghosh, sì, \We il [\W]risultato è lo stesso.
Bart Kiers,
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.