2010-08-12 10 views
30

ho i seguenti criteri per la creazione di un'espressione regolare per una password che è conforme alle seguenti regole:espressione regolare per far rispettare le password complesse, abbinando 3 su 4 regole

  1. La password deve essere lunga 8 caratteri (questo posso fare :-)).

La password deve quindi contenere caratteri di almeno 3 dei seguenti 4 regole:

  1. maiuscole
  2. Bassa caso
  3. Numeri
  4. non alfa numerico

Posso fare in modo che l'espressione corrisponda a TUTTE quelle regole con la seguente espressione:

/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.[\W]).{8,}$/ 

Ma io sto lottando con il modo di fare questo in modo tale che ha solo bisogno di risolvere qualsiasi 3 dei 4 regole.

Qualcuno può aiutarmi con questo?

+7

devo dire che questo è uno di quei casi in cui penso che il codice sarebbe probabilmente moltopiù leggibile se avessi 4 regex differenti. E poi forse ha avuto un conteggio e per ciascuna regex che corrisponde a incrementare il conteggio e poi alla fine basta controllare se il conteggio è 3 o superiore. –

+0

Quale linguaggio di programmazione stai usando? – kennytm

risposta

73

Non utilizzare una regex per controllarla.

if (password.length < 8) 
    alert("bad password"); 
var hasUpperCase = /[A-Z]/.test(password); 
var hasLowerCase = /[a-z]/.test(password); 
var hasNumbers = /\d/.test(password); 
var hasNonalphas = /\W/.test(password); 
if (hasUpperCase + hasLowerCase + hasNumbers + hasNonalphas < 3) 
    alert("bad password"); 

Se è necessario utilizzare una singola espressione regolare:

^(?:(?=.*[a-z])(?:(?=.*[A-Z])(?=.*[\d\W])|(?=.*\W)(?=.*\d))|(?=.*\W)(?=.*[A-Z])(?=.*\d)).{8,}$ 

Questa espressione regolare non è ottimizzato per l'efficienza. È costruito da A·B·C + A·B·D + A·C·D + B·C·D con alcuni fattori di fattorizzazione. Ripartizione:

^ 
(?: 
    (?=.*[a-z])  # 1. there is a lower-case letter ahead, 
    (?:    # and 
     (?=.*[A-Z]) #  1.a.i) there is also an upper-case letter, and 
     (?=.*[\d\W]) #  1.a.ii) a number (\d) or symbol (\W), 
    |     # or 
     (?=.*\W)  #  1.b.i) there is a symbol, and 
     (?=.*\d)  #  1.b.ii) a number ahead 
    ) 
|      # OR 
    (?=.*\W)   # 2.a) there is a symbol, and 
    (?=.*[A-Z])  # 2.b) an upper-case letter, and 
    (?=.*\d)   # 2.c) a number ahead. 
) 
.{8,}     # the password must be at least 8 characters long. 
$ 
5

È potrebbe scrivere un regex davvero sofisticato per farlo. Invece, suggerirei di scrivere quattro regex distinte, una per ogni regola, e testarle una alla volta, contando quante di esse corrispondono. Se tre su quattro ha fatto, accetta la password.

1

Id suggerisco di eseguire i controlli separatamente e quindi di calcolare il numero di corrispondenze.

(Mi piacerebbe anche non uso un'espressione regolare in nessuno di essi, ma questo è solo il mio POV personali - vale a dire che ostacolano la leggibilità e sono generalmente una sola scrittura di codice)

3

È possibile utilizzare la seguente espressione regolare:

(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$)?(^(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=]).*$)?(^(?=.*\d)(?=.*[A-Z])(?=.*[@#$%^&+=]).*$)?(^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$)? 

Con una lunghezza minima della password di 8 e lunghezza massima 32 è possibile utilizzare la seguente espressione regolare:

(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,32}$)?(^(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=]).{8,32}$)?(^(?=.*\d)(?=.*[A-Z])(?=.*[@#$%^&+=]).{8,32}$)?(^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).{8,32}$)? 
+0

Su quattro è necessario prendere 3 alla volta e se una di esse corrisponde al modello di password verrà convalidato. – ajithparamban

+3

Perché impostare una lunghezza massima della password? – evolutionxbox

Problemi correlati