2017-09-01 1 views
2

Je les règles suivantes pour la validation du mot de passe:Regex validation de mot de passe pour ensemble de règles

  • au moins 8 caractères
  • au moins 1 lettre majuscule
  • au moins 3 lettre minuscule
  • au moins 1 nombre
  • au moins 1 caractère spécial
  • le caractère de début doit être une lettre (majuscule ou minuscule)
  • maximum 2 caractères identiques dans la rangée (par exemple, Passs123! devrait être invalide, mais sPass123! valide)

J'ai essayé de trouver modèle regex pour ces règles, et le plus proche est celle-ci:

/^(?=.*[0-9]) (?=.*[[email protected]#$%^&*]) (?=.*[a-z]) (?=.*[A-Z]) {8} $/ 

mais il ne fonctionne pas pour toutes les règles.

Je suis novice dans les expressions régulières, et j'apprécierais toutes les ressources pour apprendre la regex.

Répondre

3

Vous pouvez considérer le motif suivant:

^(?=.*[0-9])(?=.*[^\w\s])(?=(?:[^a-z]*[a-z]){3})(?=.*[A-Z])(?!.*(.)\1{2})[a-zA-Z].{7,}$ 

Voir la regex demo (notez que \n est ajouté dans [^a-z] uniquement à des fins de démonstration d'essai afin de ne pas déborder sur les sauts de ligne dans une seule entrée multiligne).

Détails

  • ^ - début de la chaîne
  • (?=.*[0-9])-1 chiffres
  • (?=.*[^\w\s]) - tout 1 caractère spécial (pas un mot, ni omble chevalier blancs) (NOTE: si vous voulez seulement pour exiger des caractères spéciaux à partir d'une liste, utilisez (?=.*[[email protected]#$%^&*]) comme dans le modèle d'origine)
  • (?=(?:[^a-z]*[a-z]){3}) - 3 minuscules
  • (?=.*[A-Z])-1 lettre majuscule
  • (?!.*(.)\1{2}) - pas 3 mêmes caractères consécutifs
  • [a-zA-Z] - premier caractère est une lettre
  • .{7,} - puis 7+ caractères
  • $ - fin de chaîne

Pour en savoir plus sur la validation de mot de passe, voir Lookahead Example: Simple Password Validation.

Notez que vous pouvez améliorer les contrôles de lookaheads en utilisant un principle of contrast: remplacer (?=.*[0-9]) avec (?=[^0-9]*[0-9]), (?=.*[A-Z]) avec (?=[^A-Z]*[A-Z]), (?=.*[^\w\s]) avec (?=[\w\s]*[^\w\s]).

+0

La condition "3 lettres minuscules" ne fonctionne pas. 'PASS123! 'correspond à regexp. – ikleschenkov

+0

@ikleschenkov Cela fonctionne, cela ne fonctionne pas dans la démo uniquement à cause de la construction '[^ a-z]' qui correspond aussi aux nouvelles lignes. Voici un lien plus approprié - https://regex101.com/r/g4gptV/2, où '[^ a-z]' est transformé en '[\ \ na-z]' juste parce que la démo contient une seule chaîne mutliline. Dans un scénario réel, ces lignes sont des chaînes autonomes. –

+0

@ WiktorStribiżew J'apprends beaucoup de vos solutions. +1 pour toujours l'expliquer bien :-) – Gurman