2014-09-14 7 views
2

J'essaie d'écrire la fonction de validation de mot de passe avec regexp et je ne sais pas comment le faire. Golang regex est différent de l'autre langue. Avoir quelqu'un une idée, à quoi devrait ressembler ce motif de regexp?
Le modèle doit valider:Validation du mot de passe avec regexp

/* 
* Password rules: 
* at least 7 letters 
* at least 1 number 
* at least 1 upper case 
* at least 1 special character 
*/ 
+0

Exprimant ceci dans un regex est difficile. J'irais avec trois regexes et un appel 'len()' à la place. – Thomas

+0

Facilement fait avec régulière regex qui utilisent des assertions. Sinon, une simple série de tests de caractères: longueur, caractère char, alpha supérieur, ponctuation. – sln

+0

Cher modérateur @ M42, votre question "dupliquer" ne peut pas s'appliquer avec go regexp (http://golang.org/pkg/regexp/syntax/), en utilisant re2 (http://code.google.com/p/re2/ wiki/Syntax, une bibliothèque d'expressions régulières efficace et basée sur des principes). Dans le contexte de Go, ce ** n'est pas un doublon **. – VonC

Répondre

6

Le droit regexp serait ... pas ici regexp.

Vous pouvez définir une fonction personnalisée qui validerait le mot de passe, et le combiner avec d'autres cadres aidant la validation d'un champ, comme mccoyst/validate (mentionné dans ce discussion about parameter validation)

Vous avez également go-validator/validator WHIC permet de définir des validations similaires (mais j'utiliserais toujours un validateur personnalisé au lieu d'une ou plusieurs expressions rationnelles).


Note: go regexp est basé sur re2, une banque d'expression régulière efficace, fondée sur des principes).

Ainsi, les principaux arbitrages commerciaux sont pas références arrière par exemple: (abc)\1 et sans regard autotractées correspondants.
En échange, vous obtenez haute vitesse regex.

+0

pourquoi ne pas regexps, c'est mauvais? –

+0

@zero_coding le voici, car vous ne pouvez pas exprimer facilement les contraintes dans * un * regexp. Alors ... http://programmers.stackexchange.com/q/223634/3915 et http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/ – VonC

+0

regex différent puis autre langue? Quelle est la raison? –

9

Cela est en fait impossible puisque Go regex ne prend pas en charge le retour arrière.

Cependant, il est facile à mettre en œuvre, un exemple simple:

func verifyPassword(s string) (sevenOrMore, number, upper, special bool) { 
    letters := 0 
    for _, s := range s { 
     switch { 
     case unicode.IsNumber(s): 
      number = true 
     case unicode.IsUpper(s): 
      upper = true 
      letters++ 
     case unicode.IsPunct(s) || unicode.IsSymbol(s): 
      special = true 
     case unicode.IsLetter(s) || s == ' ': 
      letters++ 
     default: 
      //return false, false, false, false 
     } 
    } 
    sevenOrMore = letters >= 7 
    return 
} 
Questions connexes