web-dev-qa-db-fra.com

Angular validation de modèle avec regex

J'ai besoin de faire un validateur de modèle de mot de passe

le mot de passe doit avoir:

  • 1 lettre Majuscule 
  • 1 lettre minuscule 
  • Un numéro 
  • Une longueur minimale de 8.

J'ai trouvé ce motif de regex:

Validators.pattern('/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d!$%@#£€*?&]')

cependant, le validateur prétend toujours que ma saisie est invalide

errors:    
   pattern:
      actualValue: "Test1234"
      requiredPattern: "^/^(?=.*[A-Za-z])(?=.*d)[A-Za-zd!$%@#£€*?&]$"

selon https://regex101.com/r/AfAdKp/1 cette valeur est supposée être valide.

Edit: pour clarifier, Test1234 est supposé fonctionner

2
Nicolas

Vous avez plusieurs problèmes avec votre expression rationnelle actuelle:

  1. Votre regex n'a pas de quantificateur pour la classe de personnage
  2. Validators.pattern n'a pas besoin de délimiteurs mais vous en avez jeté un au début
  3. Vous devriez doubler les jetons d'échappement.

Ce dont vous avez besoin est ceci:

Validators.pattern('^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)[A-Za-z\\d!$%@#£€*?&]{8,}$');

Voir démo en direct ici

2
revo

Vous devez ajouter le quantificateur [A-Za-z\d!$%@#£€*?&]{8,} pour répéter la classe de caractères au moins 8 fois et séparer les assertions pour un caractère majuscule et minuscule:

Validators.pattern('^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)[A-Za-z\\d!$%@#£€*?&]{8,}$')

^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z\d!$%@#£€*?&]{8,}$

  • ^ Assert la position au début de la chaîne
  • (?=.*[A-Z]) Lookahead positif pour affirmer que ce qui suit est un caractère majuscule
  • (?=.*[a-z]) Lookahead positif pour affirmer que ce qui suit est un caractère minuscule
  • (?=.*\d) Lookahead positif pour affirmer que ce qui suit est un chiffre
  • [A-Za-z\d!$%@#£€*?&]{8,} Faites correspondre au moins un personnage dans la classe de personnage 8 fois ou plus
  • $ Assert la position à la fin de la ligne

const strings = [
  "A88888jf",
  "Aa88888jf",
  "Aa888jf",
  "AAAAAAAAAAA",
  "aaaaaaaaaaaaaa",
  "2222222222222222",
  "1sAdfe44",
  "$#fd#######"
];
let pattern = /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z\d!$%@#£€*?&]{8,}$/;

strings.forEach((s) => {
  console.log(s + " ==> " + pattern.test(s));
});

1
The fourth bird