Regexp Java pour la validation du mot de passe
Je suis de la création d'une regexp pour la validation du mot de passe pour être utilisé dans une application Java comme un paramètre de configuration.
La regexp est:
^.*(?=.{8,})(?=..*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
La stratégie de mot de passe est:
-
Au moins 8 caractères
-
Contient au moins un chiffre
-
Contient au moins un inférieur alpha char et une supérieure alpha char
-
Contient au moins un char à l'intérieur d'un ensemble de caractères spéciaux (
@#%$^
etc.) -
Ne contiennent pas d'espace, tabulation, etc.
Il me manque juste le point 5. Je ne suis pas en mesure d'avoir la regexp vérifier l'espace, tabulation, retour chariot, etc.
Quelqu'un pourrait-il m'aider?
- Règles de mot de passe sont mauvais. Merci de voir de Référence - Validation du Mot de passe pour plus d'info.
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Explication:
Il est facile d'ajouter, de modifier ou de supprimer des règles, étant donné que chaque règle est indépendante "module".
La
(?=.*[xyz])
construire mange la totalité de la chaîne (.*
) et revient à la première occurrence où[xyz]
peut égaler. Il réussit si[xyz]
est trouvé, il ne parvient pas autrement.L'alternative consisterait à l'aide d'un réticents qualifier:
(?=.*?[xyz])
. Pour un mot, ce ne sera guère faire toute la différence, pour beaucoup plus de chaînes qu'il pourrait être le plus efficace variante.La plupart variante plus efficace (mais plus difficile à lire et à maintenir, donc les plus sujettes à l'erreur) serait
(?=[^xyz]*[xyz])
, bien sûr. Pour une regex de cette longueur et de cette fin, je voudrais, dis-recommandons de le faire de cette façon, comme il n'a pas de réels avantages.\\s
. C'est une Java condition, pas une regex exigence.(?!.*\s)
au lieu de(?=\S+$)
peut-être plus de sens ;).(?=...)
modèle afin qu'il corresponde à la configuration du reste de l'expression..(?=\S+$)
) ou "ne contient pas les caractères d'espace" ((?!.*\s)
) est une question de préférence. Utilisez ce que vous aimez mieux. 🙂}[]{@123aaaBBB
et il a très bien fonctionné#%&+
caractères dans l'url lors de la validation, regarde ceux-ci sont réservés caractères pour les url http. Alors comment faire pour éviter que l'utilisateur de ne pas utiliser ces caractères ...?exemple simple utilisant les regex
Explications:
(?=.*[0-9])
un chiffre doit apparaître au moins une fois(?=.*[a-z])
une lettre minuscule doit se produire au moins une fois(?=.*[A-Z])
une lettre majuscule doit se produire au moins une fois(?=.*[@#$%^&+=])
un caractère spécial doit avoir lieu au moins une fois(?=\\S+$)
pas d'espace a permis dans l'ensemble de la chaîne de.{8,}
au moins 8 caractèresToutes les déjà donné les réponses d'utiliser le même (bon) technique d'utiliser une anticipation pour chaque exigence. Mais ils contiennent un couple d'inefficacités et un gigantesque bug, selon le back-end qui va effectivement utiliser le mot de passe.
Je vais commencer avec la regex de la accepté de répondre:
Tout d'abord, depuis Java prend en charge
\A
et\z
je préfère utiliser ceux assurez-vous que l'ensemble de la chaîne est validé, indépendamment dePattern.MULTILINE
. Cela n'affecte pas les performances, mais évite les erreurs lors de la regexes sont recyclés.De vérifier que les mots de passe ne doivent pas contenir d'espaces et de vérifier sa longueur minimale qui peut être fait en une seule passe par l'aide de tout cela à la fois en mettant la variable quantificateur
{8,}
sur le raccourci\S
qui limite les caractères autorisés:Si le mot de passe fourni contient un espace, de tous les contrôles seront effectués, uniquement pour avoir le contrôle final échouer sur l'espace. Ceci peut être évité par le remplacement de tous les points avec
\S
:La dot doit être utilisée que si vous désirez vraiment pour permettre à n'importe quel caractère. Sinon, utilisez un (annulés) classe de personnage à la limite de votre regex pour seulement ces personnages qui sont vraiment autorisé. S'il fait peu de différence dans ce cas, ne pas utiliser le point quand quelque chose d'autre est plus approprié est une très bonne habitude. Je vois beaucoup trop de cas de catastrophique mandature parce que le développeur était trop paresseux pour utiliser quelque chose de plus approprié que de la dot.
Car il ya une bonne chance les premiers tests permettra de trouver un personnage dans la première moitié du mot de passe, un paresseux quantificateur peut être plus efficace:
Mais maintenant, pour la très importante question: aucune réponse ne mentionne le fait que la question d'origine semble être écrit par quelqu'un qui pense en ASCII. Mais en Java, les chaînes Unicode. Sont non-ASCII des caractères autorisés dans les mots de passe? Si elles le sont, ne sont ASCII des espaces non autorisés, ou devrait tous les espaces Unicode être exclus.
Par défaut
\s
correspond uniquement ASCII de l'espace, de sorte que son inverse\S
correspond à tous les caractères Unicode (espaces ou pas) et tous les non-blanc caractères ASCII. Si des caractères Unicode sont permis, mais Unicode espaces ne sont pas, lesUNICODE_CHARACTER_CLASS
drapeau peut être spécifié pour faire\S
exclure des espaces Unicode. Si des caractères Unicode ne sont pas autorisés, puis[\x21-\x7E]
peut être utilisé à la place de\S
pour correspondre à tous les caractères ASCII qui ne sont pas un espace ou un caractère de contrôle.Qui nous amène à la prochaine question potentielle: voulons-nous laisser les caractères de contrôle? La première étape de l'écriture d'une bonne regex est de spécifier exactement ce que vous voulez et ce que vous n'avez pas. Le seul 100% techniquement réponse correcte est que le mot de passe de la spécification de la question est ambigu, car il ne prend pas en état de savoir si certaines des plages de caractères, comme le contrôle des caractères ou des caractères non-ASCII sont autorisés ou non.
Vous ne devez pas utiliser trop complexe Regex (si vous pouvez l'éviter) parce qu'ils sont
Bien qu'il pourrait être une petite surcharge de performance en utilisant de nombreuses petites expressions régulières, les points au-dessus de dépasser facilement.
Je voudrais mettre en œuvre comme ceci:
Exigence De Mot De Passe :
Mots de passe doit contenir des caractères d'au moins deux (2) de ces groupements: lettres, des chiffres et des caractères spéciaux.
Je l'ai testé et il fonctionne
Pour quiconque s'intéresse à des exigences minimales pour chaque type de personnage, je suggère de faire l'extension suivante sur Tomalak est accepté réponse:
Avis que c'est une chaîne de mise en forme et pas la dernière expression régulière pattern. En remplaçant simplement l' %d avec le minimum requis événements pour: des chiffres, des minuscules, des majuscules, des non-chiffres/caractères, et tout le mot de passe (respectivement). Maximum d'occurrences est rare (sauf si vous voulez un max de 0, effectivement, le rejet de toute ces personnages) mais ceux-ci pourraient être facilement ajoutés. Avis supplémentaires de regroupement autour de chaque type, de sorte que le min/max contraintes de permettre aux non-matches consécutifs. Cela a fonctionné à merveille pour un système où l'on pouvait configurer de manière centralisée combien de chaque type de caractère, nous avons exigé et ensuite le site web ainsi que deux différentes plates-formes mobiles extraction d'informations pour la construction de l'expression régulière pattern en fonction d'une chaîne de mise en forme.
Celui-ci vérifie pour chaque caractère spécial :
Méthode Java prêt pour vous, avec des paramètres
Il suffit de copier et coller et définissez les paramètres.
Si vous ne voulez pas un module, juste un commentaire ou ajouter un "si", comme le fait par moi pour char spécial
Je pense que cela peut le faire aussi (comme un simple mode):
[Regex Demo]
facile
("^ (?=.* [0-9]) (?=.* [a-z]) (?=.* [A-Z]) (?=.* [\\W_])[\\S]{8,10}$")
.
(?! quoi que ce soit ) ->(vice versa) signifie négatif attend avec impatience si la condition est écrit retour faux.
fermer sens ^(état)(état)(état)(état)[\S]{8,10}$
Explication:
à côté de la boucle. Caractère.appel isdigit(s).charAt(i))
ajouter un plus de 5 à n. Caractère.isLetter(s).charAt(i))
chaîne alphanumérique, ailleurs son ne pas.
Vous Pouvez aussi Faire comme Ceci.