2010-08-12 8 views
30

je les critères suivants pour créer une expression régulière pour un mot de passe qui est conforme aux règles suivantes:expression régulière pour appliquer des mots de passe complexes, correspondant à 3 sur 4 règles

  1. Le mot de passe doit être de 8 caractères (ce que je peux faire :-)).

Le mot de passe doit alors contenir des caractères d'au moins 3 des 4 règles suivantes:

  1. Majuscules
  2. Minuscules
  3. Nombres
  4. non-alpha numérique

Je peux faire en sorte que l'expression corresponde à TOUTES ces règles avec l'expression suivante:

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

Mais je me bats avec la façon de faire de telle sorte qu'il n'a besoin que de résoudre tout 3 des 4 règles.

Quelqu'un peut-il m'aider avec ça? Ne pas utiliser une regex pour le vérifier ensuite.

+7

Je dois dire que c'est l'un de ces cas, quand je pense que votre code serait probablement beaucoup plus lisible si vous avez 4 regexs différents à la place. Et puis peut-être avait un compte et pour chacun des regex qui correspond à vous incrémenter le compte, puis à la fin, vous vérifiez simplement si le compte est 3 ou plus. –

+0

Quel langage de programmation utilisez-vous? – kennytm

Répondre

73

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"); 

Si vous devez utiliser un seul regex:

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

Ce regex est pas optimisé pour l'efficacité. Il est construit par A·B·C + A·B·D + A·C·D + B·C·D avec une certaine factorisation. Répartition:

^ 
(?: 
    (?=.*[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

Vous pourrait écrire un regex vraiment sophistiqué pour le faire. Au lieu de cela, je suggérerais d'écrire quatre expressions régulières distinctes, une pour chaque règle, et de les tester une par une, en comptant combien d'entre elles correspondraient. Si trois sur quatre l'ont fait, acceptez le mot de passe.

1

Id suggère de faire les vérifications séparément, puis en totalisant combien de match.

(Je voudrais aussi ne pas utiliser une expression régulière dans l'un d'eux, mais c'est juste mon personnel POV - à savoir qu'ils entravent la lisibilité et sont en écriture une fois le code général)

3

Vous pouvez utiliser l'expression rationnelle suivante:

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

Avec une longueur minimale de mot de passe de 8 et longueur max 32, vous pouvez utiliser l'expression rationnelle suivante:

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

Sur quatre, vous devez prendre 3 à l'heure et si l'un d'entre eux correspond à la configuration du mot de passe sera validée. – ajithparamban

+3

Pourquoi définir une longueur de mot de passe maximale? – evolutionxbox

Questions connexes