Je crée une expression régulière pour la validation de mot de passe à utiliser dans une application Java en tant que paramètre de configuration.
L'expression régulière est:
^.*(?=.{8,})(?=..*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
La politique de mot de passe est:
Au moins 8 caractères
Contient au moins un chiffre
Contient au moins un caractère alpha inférieur et un caractère alpha supérieur
Contient au moins un caractère dans un ensemble de caractères spéciaux (
@#%$^
etc.)Ne contient pas d'espace, de tabulation, etc.
Il ne me manque que le point 5. Je ne parviens pas à faire vérifier par l'expression rationnelle l'espace, la tabulation, le retour chariot, etc.
Quelqu'un pourrait-il m'aider?
Réponses:
Essaye ça:
Explication:
Il est facile d'ajouter, de modifier ou de supprimer des règles individuelles, car chaque règle est un "module" indépendant.
La
(?=.*[xyz])
construction mange la chaîne entière (.*
) et revient à la première occurrence où[xyz]
peut correspondre. Il réussit s'il[xyz]
est trouvé, sinon il échoue.L'alternative serait à l' aide d' un qualificatif réticent:
(?=.*?[xyz])
. Pour une vérification de mot de passe, cela ne fera guère de différence, pour des chaînes beaucoup plus longues, cela pourrait être la variante la plus efficace.La variante la plus efficace (mais la plus difficile à lire et à maintenir, donc la plus sujette aux erreurs) serait bien
(?=[^xyz]*[xyz])
sûr. Pour une expression régulière de cette longueur et à cette fin, je ne recommanderais pas de le faire de cette façon, car cela n'a pas de réels avantages.la source
\\s
. C'est une exigence Java, pas une exigence regex.(?=...)
modèle pour qu'il corresponde à la configuration du reste de l'expression ..(?=\S+$)
) ou "ne contient pas de caractère espace" ((?!.*\s)
) est une question de préférence. Utilisez ce que vous préférez. :)exemple simple utilisant regex
Explications:
(?=.*[0-9])
un chiffre doit apparaître au moins une fois(?=.*[a-z])
une lettre minuscule doit apparaître au moins une fois(?=.*[A-Z])
une lettre majuscule doit apparaître au moins une fois(?=.*[@#$%^&+=])
un caractère spécial doit apparaître au moins une fois(?=\\S+$)
aucun espace n'est autorisé dans toute la chaîne.{8,}
au moins 8 caractèresla source
Toutes les réponses précédemment données utilisent la même technique (correcte) pour utiliser une anticipation distincte pour chaque exigence. Mais ils contiennent quelques inefficacités et un bogue potentiellement massif, en fonction du back-end qui utilisera réellement le mot de passe.
Je vais commencer par l'expression régulière de la réponse acceptée:
Tout d'abord, puisque Java prend en charge
\A
et que\z
je préfère les utiliser pour m'assurer que toute la chaîne est validée, indépendamment dePattern.MULTILINE
. Cela n'affecte pas les performances, mais évite les erreurs lorsque les expressions régulières sont recyclées.Vérifier que le mot de passe ne contient pas d'espaces et vérifier sa longueur minimale peut être fait en un seul passage en utilisant le tout à la fois en mettant le quantificateur variable
{8,}
sur la sténographie\S
qui limite les caractères autorisés:Si le mot de passe fourni contient un espace, toutes les vérifications seront effectuées, seulement pour que la vérification finale échoue sur l'espace. Cela peut être évité en remplaçant tous les points par
\S
:Le point ne doit être utilisé que si vous souhaitez vraiment autoriser un caractère. Sinon, utilisez une classe de caractères (annulée) pour limiter votre expression régulière aux seuls caractères qui sont vraiment autorisés. Bien que cela fasse peu de différence dans ce cas, ne pas utiliser le point lorsque quelque chose d'autre est plus approprié est une très bonne habitude. Je vois beaucoup trop de cas de retour en arrière catastrophique parce que le développeur était trop paresseux pour utiliser quelque chose de plus approprié que le point.
Comme il y a de bonnes chances que les tests initiaux trouvent un caractère approprié dans la première moitié du mot de passe, un quantificateur paresseux peut être plus efficace:
Mais maintenant pour le problème vraiment important: aucune des réponses ne mentionne le fait que la question originale semble avoir été écrite par quelqu'un qui pense en ASCII. Mais en Java, les chaînes sont Unicode. Les caractères non ASCII sont-ils autorisés dans les mots de passe? Si tel est le cas, seuls les espaces ASCII sont-ils interdits ou tous les espaces Unicode doivent-ils être exclus.
Par défaut,
\s
correspond uniquement aux espaces ASCII, donc son inverse\S
correspond à tous les caractères Unicode (espaces ou non) et à tous les caractères ASCII sans espaces. Si les caractères Unicode sont autorisés mais que les espaces Unicode ne le sont pas, l'UNICODE_CHARACTER_CLASS
indicateur peut être spécifié pour\S
exclure les espaces Unicode. Si les caractères Unicode ne sont pas autorisés, ils[\x21-\x7E]
peuvent être utilisés à la place de\S
pour faire correspondre tous les caractères ASCII qui ne sont pas un espace ou un caractère de contrôle.Ce qui nous amène au prochain problème potentiel: voulons-nous autoriser les personnages de contrôle? La première étape dans l'écriture d'une expression régulière appropriée est de spécifier exactement ce que vous voulez faire correspondre et ce que vous ne voulez pas. La seule réponse techniquement correcte à 100% est que la spécification du mot de passe dans la question est ambiguë car elle n'indique pas si certaines plages de caractères comme les caractères de contrôle ou les caractères non ASCII sont autorisées ou non.
la source
Vous ne devriez pas utiliser des expressions régulières trop complexes (si vous pouvez les éviter) car elles sont
Bien que l'utilisation de nombreuses petites expressions régulières puisse entraîner une légère surcharge de performances, les points ci-dessus l'emportent facilement.
Je voudrais implémenter comme ceci:
la source
Exigence de mot de passe:
Les mots de passe doivent inclure des caractères d'au moins deux (2) de ces groupements: caractères alphanumériques et spéciaux.
Je l'ai testé et ça marche
la source
Pour toute personne intéressée par les exigences minimales pour chaque type de personnage, je suggérerais de faire l'extension suivante sur la réponse acceptée de Tomalak:
Notez qu'il s'agit d'une chaîne de mise en forme et non du modèle final de regex. Remplacez simplement% d par les occurrences minimales requises pour: chiffres, minuscules, majuscules, non-chiffre / caractère et mot de passe entier (respectivement). Un maximum d'occurrences est peu probable (sauf si vous voulez un maximum de 0, rejetant effectivement de tels caractères) mais ceux-ci pourraient également être facilement ajoutés. Notez le regroupement supplémentaire autour de chaque type afin que les contraintes min / max permettent des correspondances non consécutives. Cela a fonctionné à merveille pour un système où nous pouvions configurer de manière centralisée le nombre de caractères de chaque type dont nous avions besoin, puis demander au site Web ainsi qu'à deux plates-formes mobiles différentes de récupérer ces informations afin de construire le modèle d'expression régulière en fonction de la chaîne de formatage ci-dessus.
la source
Celui-ci vérifie chaque caractère spécial:
la source
Méthode Java prête pour vous, avec paramètres
Copiez et collez simplement et définissez les paramètres souhaités.
Si vous ne voulez pas de module, commentez-le ou ajoutez un "si" comme je l'ai fait pour un caractère spécial
la source
Utilisez la bibliothèque Passay qui est une API puissante.
la source
Je pense que cela peut le faire aussi (en mode plus simple):
[Démo Regex]
la source
facile
("^ (? =. * [0-9]) (? =. * [Az]) (? =. * [AZ]) (? =. * [\\ W _]) [\\ S] {8 , 10} $ ")
(? = n'importe quoi) -> signifie positif regarde vers l'avant dans toute la chaîne d'entrée et assurez-vous que cette condition est écrite. s'il n'est pas écrit, retourne false .
(?! n'importe quoi) -> (vice versa) signifie négatif attend en avant si la condition est écrite return false .
fermer la signification ^ (condition) (condition) (condition) (condition) [\ S] {8,10} $
la source
Explication:
la source
Vous pouvez également faire comme ça.
la source
Exemple de bloc de code pour un mot de passe fort:
la source
RegEx est -
la source