2009-10-25 9 views
0

Je veux que le nom d'utilisateur soit n'importe quels caractères avec _ ou - mais Perl ne fonctionne pas, pourquoi?Comment faire correspondre un texte qui peut contenir - ou un trait de soulignement en utilisant une expression régulière?

if ("kunjaaN-" =~ /^[a-zA-Z-_]{1,7}$/) 
{ print "equal" ; } 
+3

Mec, vous ai demandé ce que un trait de soulignement fait dans une expression rationnelle, maintenant vous demandez pourquoi vous ne pouvez pas correspondre à un trait de soulignement lorsque vous ne l'avez pas inclus dans le motif ??! – Ether

+2

Wow La communauté PERL dans stackoverflow est assez hostile aux débutants ... de toute façon je pense que le problème était le {1,7} et non le _. – unj2

+5

@kunjaan: seulement quelques uns. essayez de l'ignorer. – ysth

Répondre

10

Il ne fonctionne pas parce que kunjaaN- est huit caractères, et vous vous limiter à 1..7

Pour un nom d'utilisateur, pourquoi ne pas augmenter la limite à quelque chose de décent?

Aussi, si vous voulez _ inclus, vous devez l'inclure dans votre classe de caractères.

Essayez cette regex:

^[a-zA-Z_-]{1,16}\z 


Note:
A l'intérieur des classes de caractères, le caractère - peut avoir une signification particulière. Par exemple, [a-z] signifie 'la plage de caractères commençant par a et se terminant par z', tandis que [az-] signifie 'soit a soit z ou -'.

Pour créer un - non spécial, vous pouvez le placer au début ou à la fin d'une classe, ou lui échapper avec une barre oblique inverse. [a\-z] correspondra a ou z ou -.
L'échappement est généralement préféré car il évite les accidents si des caractères supplémentaires sont ajoutés par inadvertance à la fin de la classe.

+4

C'est embarrassant. Merci. – unj2

+1

Hé, nous faisons tous des choses comme ça de temps en temps. :) –

+3

Oui, mais nous n'avons pas tous demandé ce que le soulignement fait dans une expression régulière ;-) – innaM

4

Si vous ne souhaitez pas autoriser un saut de ligne possible à la fin de votre chaîne, utilisez la fin \ z de l'ancre de chaîne au lieu de l'ancre $:

/^[a-z_-]{1,8}\z/i 
+1

Merci pour le conseil. – unj2

Questions connexes