Je veux une expression régulière pour vérifier cela
un mot de passe doit être composé de huit caractères, dont une lettre majuscule, un caractère spécial et des caractères alphanumériques.
Et voici mon expression de validation qui est pour huit caractères dont une lettre majuscule, une lettre minuscule et un chiffre ou caractère spécial.
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"
Comment puis-je l'écrire pour un mot de passe qui doit comporter huit caractères, dont une lettre majuscule, un caractère spécial et des caractères alphanumériques?
Réponses:
L'expression régulière que vous recherchez sera probablement énorme et un cauchemar à maintenir, en particulier pour les personnes qui ne sont pas familières avec les expressions régulières.
Je pense qu'il serait plus facile de décomposer votre regex et de le faire un peu à la fois. Cela peut prendre un peu plus à faire, mais je suis presque sûr que sa maintenance et son débogage seraient plus faciles. Cela vous permettrait également de fournir des messages d'erreur plus dirigés à vos utilisateurs (autres que seulement
Invalid Password
), ce qui devrait améliorer l'expérience utilisateur.D'après ce que je vois, vous maîtrisez assez bien les regex, donc je suppose que vous donner les expressions régulières pour faire ce dont vous avez besoin serait futile.
En voyant votre commentaire, voici comment je procéderais:
Doit comporter huit caractères: vous n'avez pas besoin d'une expression régulière pour cela. L'utilisation de la
.Length
propriété devrait suffire.Incluant une lettre majuscule: vous pouvez utiliser l'
[A-Z]+
expression régulière. Si la chaîne contient au moins une lettre majuscule, cette expression régulière produiratrue
.Un caractère spécial: vous pouvez utiliser soit le
\W
qui correspondra à n'importe quel caractère qui n'est pas une lettre ou un chiffre ou bien, vous pouvez utiliser quelque chose comme ça[!@#]
pour spécifier une liste personnalisée de caractères spéciaux. Notez cependant que les caractères tels que$
,^
,(
et)
sont des caractères spéciaux dans la langue d'expression régulière, ils ont donc besoin d'être échappé comme ceci:\$
. Donc, en bref, vous pouvez utiliser le\W
.Caractères alphanumériques: l'utilisation de
\w+
doit correspondre à n'importe quelle lettre, chiffre et tiret bas.Jetez un œil à ce didacticiel pour plus d'informations.
la source
En une seule ligne:
Modifier le 28/05/2019:
Vous devez faire correspondre toute la chaîne d'entrée. Ainsi, vous pouvez placer l'expression régulière entre
^
et$
pour éviter de supposer accidentellement des correspondances partielles comme correspondant à l'entrée entière:Sources:
Expression de correspondance de mot de passe
Validation de la force du mot de passe avec des expressions régulières
la source
^
et$
. Essayez ceci:^((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})$
Tant de réponses ... toutes mauvaises!
Les expressions régulières n'ont pas d'opérateur AND, il est donc assez difficile d'écrire une regex qui correspond à des mots de passe valides, lorsque la validité est définie par quelque chose ET quelque chose d'autre ET autre chose ...
Mais, les expressions régulières n'ont un opérateur OR, donc il suffit d' appliquer le théorème de De Morgan et écrire une expression régulière qui correspond invalides des mots de passe.
tout ce qui contient moins de 8 caractères OU tout ce qui ne contient pas de chiffres OU tout ce qui ne contient pas de majuscules OU tout ce qui ne contient pas de caractères spéciaux
Alors:
Si quelque chose correspond à cela, c'est un mot de passe invalide .
la source
|.{9,}
. +1 pour le conceptLa réponse est de ne pas utiliser d'expression régulière. C'est des ensembles et du comptage.
Les expressions régulières concernent l'ordre.
Dans votre vie de programmeur, vous serez invité à faire beaucoup de choses qui n'ont pas de sens. Apprenez à creuser un niveau plus profond. Apprenez quand la question est erronée.
La question (si elle mentionnait des expressions régulières) est fausse.
Pseudocode (basculé entre trop de langues, ces derniers temps):
Je parie que vous avez lu et compris le code ci-dessus presque instantanément. Je parie que vous avez pris beaucoup plus de temps avec la regex et que vous êtes moins certain qu'elle est correcte. L'extension de l'expression régulière est risquée. Étendu l'immédiat ci-dessus, beaucoup moins.
Notez également que la question est formulée de manière imprécise. Le jeu de caractères est-il ASCII ou Unicode, ou ?? D'après ma lecture de la question, je suppose qu'au moins un caractère minuscule est supposé. Je pense donc que la dernière règle supposée devrait être:
(Changer les chapeaux en axés sur la sécurité, c'est une règle vraiment ennuyeuse / inutile.)
Apprendre à savoir quand la question est erronée est beaucoup plus important que des réponses intelligentes. Une réponse intelligente à la mauvaise question est presque toujours erronée.
la source
À titre d'exemple, comment cela pourrait être fait avec une regex lisible / maintenable.
Pour une expression régulière plus longue, vous devez toujours utiliser
RegexOptions.IgnorePatternWhitespace
pour autoriser les espaces et les commentaires dans l'expression pour une meilleure lisibilité.la source
lookahead assertion
sorte de modèle «et» pour couvrir toute la contrainte dans une seule expression régulière. Fonctionne pour plus de contraintes et peut facilement être généré si certaines contraintes doivent être activées / désactivées par la configuration.Si vous n'avez besoin que d'une majuscule et d'un caractère spécial, cela devrait fonctionner:
la source
AAaaaaaaa#
n'est pas OK selon cette expressionL'expression régulière que vous recherchez est a été:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*\[\]"\';:_\-<>\., =\+\/\\]).{8,}$/u
.Exemple et test: http://regexr.com/3fhr4
la source
.
avant le{8,}
en[^\s]
.Cette question commence à être virale et de nombreuses suggestions intéressantes sont apparues.
Oui, écrire à la main est difficile. Une solution plus simple consiste donc à utiliser un modèle. Bien que l'expression régulière résultante ne soit pas la plus optimale, elle sera plus facile à maintenir et / ou à modifier, et l'utilisateur aura un meilleur contrôle sur le résultat. Il est possible que j'aie manqué quelque chose, donc toute critique constructive sera utile.
Ces liens pourraient être intéressants: faire correspondre au moins 2 chiffres 2 lettres dans n'importe quel ordre dans une chaîne , langage d'expression régulière , capture de groupes
J'utilise ce modèle
(?=(?:.*?({type})){({count})})
basé sur tous les regex que j'ai vus dans SO. L'étape suivante consiste à remplacer le modèle nécessaire (number
,special character
...) et à ajouter une configuration pour la longueur.J'ai fait un petit cours pour composer le regex PasswordRegexGenerator.cs Un exemple:
la source
Vous pouvez utiliser la classe ci-dessous pour la validation:
où 6 et 20 sont la longueur minimale et maximale du mot de passe.
la source
(?>{8,})
(?<=...)
(?<=\p{Lu}.*)
(?<=\W.*)
(?<=\w.*)
Résumé:
(?>.{8,})(?<=\p{Lu}.*)(?<=\W.*)(?<=\w.*)
la source
Le mieux est de ne pas utiliser de regex pour tout. Ces exigences sont très légères. Sur les opérations de chaîne par processeur, pour vérifier les critères / la validation, c'est beaucoup moins cher et plus rapide que regex!
la source
la source