2010-01-11 7 views
6

J'ai besoin le contrôle suivant pour la validation du mot de passe fort:mot de passe forte expression régulière qui correspond à tout caractère spécial

  • au moins 7 caractères
  • au moins 1 caractère majuscule (AZ)
  • au moins 1 numéro (0-9)
  • au moins un omble chevalier

spéciale, j'ai trouvé et peaufiné un RegEx et c'est comme ça (désolé, j'ai perdu la référence ...):

^.*(?=.{7,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@'#.$;%^&+=!""()*,-/:<>?]).*$ 

Il travaille dans C# sauf pour le fait que je dois correspondre à tout caractère spécial, et je veux dire vraiment TOUT. En d'autres termes, j'ai besoin que le "caractère spécial" soit quoi que ce soit mais nombres et lettres majuscules/minuscules.

Edit:

Par souci de clarté, nous considérons que les accents sont caractères spéciaux, donc é, ñ et autres devraient être considérés comme des caractères spéciaux dans le cadre de cette question.

+10

Personnellement, je n'utiliserais pas une expression régulière pour cela, car elle est facile à casser et obscurcit les règles de validation. Pourquoi s'embêter? Il suffit d'écrire 4 tests simples de correspondance de chaînes. – Triptych

+0

Je vais essayer la méthode d'appariement de chaînes! – BrunoSalvino

+4

Vos règles limitent le choix des caractères de l'utilisateur et, au lieu de renforcer la sécurité du mot de passe, le font moins. Pourquoi me forcerais-je à n'utiliser que des lettres latines pour mon mot de passe? –

Répondre

8
^.*(?=.{7,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).*$ 
+0

'[^ a-zA-Z0-9]' correspondra 'é': pas un caractère vraiment spécial ... :) –

+3

Il a dit" tout sauf des chiffres et des lettres majuscules/minuscules ", je pense qu'il est qualifié. –

+2

Je pense que Bart essaye de dire que '[^ a-zA-Z0-9]' devrait correspondre à n'importe quel caractère qui n'est * pas une lettre *, mais il correspondra à 'é' que certainement * est * une lettre (I crois qu'il traitera d'autres lettres "internationales" comme å, ñ et ainsi de suite, ce qui ne devrait pas être le cas) –

4

Je crois que: -

\ w

correspond à tout caractère de mot.

L'inverse est: -

\ W

qui est ce que vous voulez.

Modifier

^.*(?=.{7,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_]).*$ 

Testez vos expressions régulières à: -

http://www.nregex.com/nregex/default.aspx

+1

Echoue pour le soulignement. –

+0

Nice, Yuriy. Modifié. –

1

Jetez un oeil ici: Unicode Regular Expressions et choisir une classe Unicode, comme \p{Symbol} ou \p{Punctuation}

+0

Oui, '\ p {Ponctuation}' et '\ p {Symbol}' est ce que je ferais. +1 –

0

Essayez ceci:

^(?=.{7,})(?=.*?\d)(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[@'#.$;%^&+=!"()*,-/:<>?]) 
5

(Non code C#)

def validate (value): 
    return (value.Length >= 7 && 
      value.IndexOfAny(['0', ..., '9']) >= 0 && 
      value.IndexOfAny(['A', ..., 'Z']) >= 0 && 
      value.IndexOfAny(['@', ..., ')'])); 

Oui, je sais que ce n'est pas ce que la question nécessaire, mais je crois qu'il est beaucoup plus clair, ont des performances plus élevées et plus facile à entretenir que toute solution RegExp.

+0

J'aime ça aussi. +1 –

+0

Cela améliore vraiment la lisibilité. – BrunoSalvino

Questions connexes