2010-10-19 7 views
2

Je connais très peu de choses sur regex.
J'essaie de tester une validation de mot de passe.Est-ce que cette expression regex autorise "*"?

est ici l'expression rationnelle qui décrit (je n'ai pas écrit, et ne sais pas ce que cela signifie):

private static string passwordField = "[^A-Za-z0-9_.\\[email protected]#$%^&*()=+;:'\"|~`<>?\\/{}]"; 

J'ai essayé un mot de passe comme « dfgbrk* », et mon code, en utilisant le regex ci-dessus, l'a permis.
Est-ce cohérent avec ce que la regex définit comme acceptable, ou est-ce un problème avec mon code?

Pouvez-vous me donner un exemple d'une chaîne que la validation en utilisant l'expression régulière ci-dessus n'est pas censée autoriser?

Ajouté: Voici comment le code d'origine utilise cette expression rationnelle (et il y travaille):

public static bool ValidateTextExp(string regexp, string sText) 
      { 
       if (sText == null) 
       { 
        Log.WriteWarning("ValidateTextExp got null text to validate against regExp {0} . returning false",regexp); 
        return false; 
       } 

       return (!Regex.IsMatch(sText, regexp)); 
      } 

Il semble que je fais quelque chose de mal ..

Merci.

+1

Indiquez le reste de votre code. Il serait utile de voir comment l'expression régulière est utilisée. –

+0

Cette regex inclut une négation de la classe de caractères (commence par '[^') donc il ne devrait pas correspondre à votre exemple 'dfgbrk *'. Pouvez-vous montrer un peu de code qui utilise réellement cette chaîne 'passwordField'? –

+0

Pourquoi voulez-vous interdire certains caractères dans un mot de passe? – CodesInChaos

Répondre

8

Votre expression régulière correspond à une valeur qui contient un seul caractère et non dans cette liste.

Votre valeur de test correspond car contient des espaces, qui ne semblent pas figurer dans votre expression.

La raison pour laquelle c'est not est que votre classe de caractères commence par ^. La raison pour laquelle il correspond à une valeur qui contient un seul caractère autre que celui-ci est que vous n'avez pas spécifié le début ou la fin de la chaîne, ni aucun quantificateur.

Ce qui précède suppose que je ne manque pas l'importance de l'un des personnages au milieu de la soupe de caractères :)

Cette réponse dépend aussi de la façon dont vous utilisez réellement le Regex dans le code.


Si votre intention est de cette chaîne Regex pour représenter les seuls caractères qui sont effectivement autorisés dans un mot de passe, vous devrez changer regex comme ceci:

string pattern = "^[A-Z0-9...etc...]+$"; 

Les parties importantes il y a:

  • Le ^ a été retiré de l'intérieur du support, à l'extérieur; où il signifie le début de la chaîne entière. Le $ a été ajouté à la fin, où il signifie la fin de la chaîne entière.
  • Ceux-ci sont nécessaires parce que sinon, votre modèle correspondra à tout ce qui contient les valeurs valides n'importe où à l'intérieur - même si des valeurs invalides sont également présentes.
  • Enfin, j'ai ajouté le quantificateur +, ce qui signifie que vous voulez trouver l'un de ces caractères valides, une ou plusieurs fois. (Ce regex ne permettrait pas un mot de passe 0 longueur)

Si vous vouliez permettre le caractère ^ également dans le cadre du mot de passe, vous ajouteriez en arrière entre les supports, mais juste * pas le premier chose juste après la parenthèse d'ouverture [. Ainsi, par exemple:

string pattern = "^[A-Z0-9^...etc...]+$"; 

Le ^ a une signification particulière dans différents endroits à différents moments Regexes.

+1

Oui, ils devraient vraiment ajouter un espace à cette expression. Interdire des espaces est mauvais. Parfois, j'utilise un espace ou deux dans mes mots de passe au cas où ils seraient imprimés accidentellement quelque part. –

+0

Les espaces sont géniaux dans les mots de passe :) –

+0

#Andrew: Merci beaucoup, je suis tout à fait sûr maintenant que je ne l'utilise pas correctement dans le code, donc je veux juste savoir ce que cela signifie, afin que je sache quoi attendre mon code pour retourner (valider ou non ..) –

5
[^A-Za-z0-9_.\[email protected]#$%^&*()=+;:'\"|~`?\/{}] 
----------------------^

Cela me semble bien, au moins en ce qui concerne le titre de votre question. Je ne comprends pas encore pourquoi les espaces dans votre échantillon ne le font pas trébucher.

Notez que je suppose que le but de cette expression est de trouver des caractères non valides. Ainsi, si l'expression est une correspondance positive, vous avez un mauvais mot de passe que vous devez rejeter. Comme il semble y avoir une certaine confusion à ce sujet, peut-être que je peux l'effacer avec un peu pseudo-code:

bool isGoodPassword = !Regex.IsMatch(@"[^A-Za-z0-9_.\-!...]", requestedPassword); 

Vous pouvez ré-écrire pour un match positif (sans la négation) comme ceci:

La nouvelle expression correspond à une chaîne qui, depuis le début de la chaîne, est remplie avec un ou plusieurs des caractères de la liste jusqu'au bout. Tout personnage ne figurant pas dans la liste entraînerait l'échec de la correspondance.

+3

Il ya aussi une négation de classe de caractères – codaddict

+1

@codaddict - l'expression annulerait également tous les caractères alphanumériques, donc je suis sûr c'est juste un double négatif ici - 'Est-ce que l'expression correspond à des caractères invalides?' –

+0

Mais la regex commence par la négation de la classe de caractères '[^ A-Za-z' ... alors comment accepte-t-il son" dfgbrk * " –

4

Votre expression régulière est juste une classe de caractères inversée et ne décrit qu'un seul caractère (mais cela ne peut pas être *). Cela dépend donc de la façon dont vous utilisez cette classe de caractères.

2

Dépend de la façon dont vous l'appliquez. Il décrit exactement un caractère, cependant, le ^ au début me buggs un peu, car il interdit à tous les autres personnages, donc il y a probablement quelque chose de terriblement poisson là-bas. Edit: comme indiqué dans les autres réponses, la raison pour laquelle votre chaîne correspond est l'espace, pas l'explication qui a été remplacée par cette ligne.

Questions connexes