219 votes

RegEx pour s'assurer que la chaîne contient au moins un caractère minuscule, un caractère majuscule, un chiffre et un symbole.

Quelle est l'expression rationnelle permettant de s'assurer qu'une chaîne donnée contient au moins un caractère de chacune des catégories suivantes.

  • Caractère minuscule
  • Caractère majuscule
  • Chiffre
  • Symbole

Je connais les patrons des ensembles individuels, à savoir [a-z] , [A-Z] , \d et _|[^\w] (Je les ai corrigés, n'est-ce pas ?).

Mais comment les combiner pour s'assurer que la chaîne les contienne tous dans n'importe quel ordre ?

446voto

Bart Kiers Points 79069

Si vous avez besoin d'une seule regex, essayez :

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

Une brève explication :

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

Et je suis d'accord avec SilentGhost, \W est peut-être un peu large. Je le remplacerais par un jeu de caractères comme celui-ci : [-+_!@#$%^&*.,?] (n'hésitez pas à en ajouter d'autres bien sûr !)

43voto

Juan Furattini Points 534

Bart Kiers, votre regex présente quelques problèmes. La meilleure façon de procéder est la suivante :

(.*[a-z].*)       // For lower cases
(.*[A-Z].*)       // For upper cases
(.*\d.*)          // For digits
(.*\W.*)          // For symbols (non-word characters)

De cette manière, vous pouvez chercher au début, à la fin ou au milieu. Dans votre cas, j'ai beaucoup de problèmes avec les mots de passe complexes.

12voto

Ensei_Tankado Points 33

La solution Bart Kiers est bon mais il ne rejette pas les chaînes de caractères ayant espaces et en acceptant les chaînes de caractères ayant soulignement ( _ ) comme symbole.

En améliorant la solution de Bart Kiers, voici l'expression rationnelle :

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])((?=.*\W)|(?=.*_))^[^ ]+$

Une brève explication :

(?=.*[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
(?=.*_)           // use positive look ahead to see if at least one underscore exists
|           // The Logical OR operator
^[^ ]+$           // Reject the strings having spaces in them.

Remarque complémentaire : vous pouvez essayer des scénarios de test sur une expression rationnelle. aquí .

6voto

SilentGhost Points 79627

Vous pouvez faire correspondre ces trois groupes séparément et vous assurer qu'ils sont tous présents. En outre, il est possible de faire correspondre ces trois groupes séparément et de s'assurer de leur présence, [^\w] semble un peu trop large, mais si c'est ce que vous voulez, vous pourriez le remplacer par \W .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X