2011-07-01 7 views
3

Je ne suis pas un ninja regex. J'ai peaufiné cela pendant une heure, et je suis sûr que quelqu'un sur SO peut le faire plus efficacement.Regex pour nom d'utilisateur avec des règles très spécifiques

Ceci est une regex pour un nom d'utilisateur avec des exigences légèrement particulières (pour accommoder les noms d'utilisateur hérités).

Règles:

  • Durée: 24 charaters maximale, 3 caractères minimum
  • ne doit pas commencer ou se terminer par un espace
  • un nombre quelconque de ce qui suit (jusqu'au champ max longueur de 24) :
    • 0-9
    • AZ
    • az
    • . (Dot)
    • '' (espace)
  • zéro ou un de chaque de jeu suivant:
    • @ (at)
    • _ (underscore)
    • - (trait d'union)
    • '(apostrophy)

est ici wh à ce jour j'ai:

^[^ ](?=[A-Za-z0-9. @_\-]{1,24}$)[a-zA-Z0-9_. ]*\.?[a-zA-Z0-9_]*[^ ]$ 

mais ce n'est pas tout à fait exact. Je ne sais pas comment échapper le '(apostrophe)

aussi, devrais-je utiliser un autre lookahead pour les caractères autorisés zéro ou une fois?

Merci.

Mise à jour: Notez que la cible est le .Net 4.0 bibliothèques avec C# regex

+0

Vous devriez vraiment indiquer dans quelle langue vous implémentez ceci, les fonctionnalités des moteurs regex sont si différentes. Aussi, voulez-vous dire «zéro ou un caractère de la classe' @ _- ''» ou «zéro ou un de chacun des caractères' @ ',' _', '-',' '' "? (La portée de 'any' est ambiguë). – LHMathies

+0

@LHMathies, Oui je vois l'ambiguïté maintenant. Je voulais dire "zéro ou un de chacun de l'ensemble [@ _- ']" alors "a _ _-'" est valide, mais "abc @@" ne l'est pas. Merci de votre attention. – DanO

Répondre

4

Ce serait une solution regex, décidez vous-même si cela est lisible/utilisable/maintenable pour vous.

(?!^.*?([@'_-]).*\1.*$)^(?!)[\w. @'-]{3,24}(?<!)$ 

Voir ce here on Regexr

(?!^.*?([@'_-]).*\1.*$) est un négatif préanalyse, si l'un des personnages que vous avez cités est trouvé, il est mis dans le groupe 1 et la capture pour assurer ce ne répète pas l'aide de la backreference \1.

^(?!) est une vue d'ensemble négative pour s'assurer qu'il n'y a pas d'espace après le début de la chaîne.

[\w. @'-]{3,24} Les personnages permettent au moins 3 au plus 24 d'entre eux

(?<!)$ est un négatif lookbehind pour assurer qu'il n'y a pas d'espace avant la fin de la chaîne.

+0

cool! si proche ... pour [@ '_-] ils sont autorisés un (ou zéro) de chacun. (donc "asdf @ '_- a" est valide) – DanO

+0

@stema, +1, sympa! –

+0

@DanO Désolé, raté celui-là, mais l'a réparé maintenant. Je pense alors que j'ai besoin d'un lookahead négatif pour chacun de ces caractères qui ne sont pas autorisés à répéter. J'ai également mis à jour le lien Regexr. – stema

4

Vous ne devriez pas résoudre ce problème avec une seule expression rationnelle, il rend le code difficile à lire et difficile à modifier. Écrivez une fonction pour chaque règle, votre chèque devient très clair (sans parler du mainteneur)

if len(username) > = 3 && 
    len(username) < = 24 && 
    has_numbers(username) && 
    has_capital(username) ... 

a fait un test de l'implémentation en python, juste pour vérifier mon approche, se trouve here (C'était avant de mettre à jour votre question avec le système cible ;-)

+0

Je suis entièrement d'accord avec le principe derrière cette suggestion. Et je l'aurais fait il y a longtemps simplement en le codant comme vous le suggérez, mais avec une regex je peux stocker cela dans la configuration, et le client peut changer d'avis la semaine prochaine, ça peut changer facilement sans recompiler un test complet de régression , etc – DanO

+0

@ Danon assez juste, heureux que nous sommes d'accord cependant sur le principe général ;-) –

Questions connexes