2009-10-13 8 views
107

Quelle est la regex pour s'assurer qu'une chaîne donnée contient au moins un caractère de chacune des catégories suivantes.RegEx vérifie que la chaîne contient au moins un caractère minuscule, un caractère majuscule, un chiffre et un symbole

  • caractère Minuscules
  • Majuscules caractère
  • Chiffre
  • Symbole

Je sais que les modèles pour des jeux individuels à savoir [a-z], [A-Z], \d et _|[^\w] (je les ai correcte, n » ai pas t je?).

Mais comment puis-je les combiner pour m'assurer que la chaîne contient tous ces éléments dans n'importe quel ordre?

+0

Quelle plate-forme/dialecte-regex? La réponse de Bart est correcte, mais les assertions lookahead ne sont pas fiables en JavaScript, par exemple. – bobince

+0

Nulle part en particulier - j'apprends regex. Y a-t-il une alternative qui peut être utilisée en javascript? – Amarghosh

+0

@bobince Hey, j'essaie de découvrir pourquoi les assertions de lookahead ne sont pas fiables en Javascript. Y a-t-il un écrit à ce sujet? –

Répondre

250

Si vous avez besoin d'un seul regex, essayez:

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

Une brève explication:

^     // the start of the string 
(?=.*[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 underscore or non-word character exists 
.+     // gobble up the entire string 
$     // the end of the string 

Je suis d'accord avec SilentGhost, [_\W] pourrait être un peu large. Je le remplacerais par un jeu de caractères comme celui-ci: [[email protected]#$%^&*.,?] (n'hésitez pas à ajouter plus de cours!)

+5

Merci encore Bart. Je n'étais pas au courant de l'avenir positif. – Amarghosh

+0

Que se passerait-il si je change le dernier '. +' En '. *'? Je n'ai pas pu trouver un cas de test qui échoue avec '. *'. Sont-ils les mêmes dans ce contexte? "Zéro ou plus de caractères" semble être bien - il suffit de demander une confirmation. – Amarghosh

+0

@Amarghosh: dans ce cas, cela ne fait aucune différence. En raison des anticipations positives, la chaîne contient déjà au moins 4 caractères. Donc, il ne fait aucune différence de changer '. +' En '. *' Ou même '. {4,}' d'ailleurs. –

4

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

+0

Merci. Je n'étais pas au courant de \ W. Je l'ai juste regardé pour trouver que ça correspond pas à Word. Y a-t-il une différence entre \ W et [\ W]? Est-ce que [\ W] est juste redondant? – Amarghosh

+0

@Amarghosh, oui, '\ W' et' [\ W] 'résultent dans le même. –

2

Bart Kiers, votre regex a quelques problèmes. La meilleure façon de le faire est la suivante:

(.*[a-z].*)  // For lower cases 
(.*[A-Z].*)  // For upper cases 
(.*\d.*)   // For digits 

De cette façon, vous cherchez, peu importe si, au début, à la fin ou au milieu. Dans votre j'ai beaucoup de problèmes avec les mots de passe complexes.

Questions connexes