2010-07-09 12 views
0

Pourquoi cette expression renvoie-t-elle la valeur true pour le caractère 1 ou V (et autres)? Comment est-ce que je pourrais le réécrire pour qu'il ne retourne vrai que lorsqu'il est vide ou un caractère de a-z?Test d'expression régulière Perl vide ou expression

~((^$)||(^[a-z]$))~ 
+0

telle que mesurée sur http://www.spaweditor.com/scripts/regex/index.php –

Répondre

8

Votre problème est au milieu:

|| 

Cela signifie:

OR the empty string OR 

Et la chaîne vide peut être entre un caractère. Ou pas de caractères. Fondamentalement, vous dites "match n'importe quoi".

Pour faire un OR avec une regex, n'utilisez qu'un seul tuyau.

Vous pouvez simplifier cela:

/^[a-z]?$/ 
1

Il correspond car l'expression contient ||. L'opérateur regex 'ou' est un simple |; deux d'entre eux signifient 'ou rien ou', et chaque chaîne correspond à une expression vide sans ancres.

De toute façon, votre expression régulière semble un peu complexe ... que diriez-vous /^([a-z]?)$/?

2

Chaîne vide ou un caractère dans la gamme az seraient:

/^[a-z]?$/ 

Rappelez-vous que ? signifie "0 ou 1 de cette" - si l'expression rationnelle se traduit par "0 ou 1 caractère entre a et z inclus".

Réécriture à utiliser un | pour « ou » (notez combien plus laid il est, donc c'est juste un exercice académique à ce moment), vous pouvez faire:

# nothing, or one character in a-z 
/^(?:|[a-z])$/ 
+0

Votre expression doit correspondre à une chaîne qui a un début - à savoir: tout. – cHao

+0

Votre deuxième est encore un peu éteint :) 'perl -e" mon $ foo = '#! @ #'; Imprimer $ foo = ~/^ | [az] $ /? 'Correspond': 'ne correspond pas' " 'prints' matches' (le '|' traverse l'ensemble de l'expression rationnelle.) –

+0

@Robert, @cHao: hmm vous avez raison, l'ordre de liaison a été mélangé. temps pour les parenthèses! :) – Ether

0

Ne pourriez-vous changer à quelque chose comme ceci:

^([a-z]?)$ 
2

Ceci est un exemple des raisons pour lesquelles vous devriez préférer \z plutôt que $ signifie « fin de chaîne ». Le motif /^[a-z]?$/ correspondra heureusement à une chaîne constituée d'une nouvelle ligne simple.

#!/usr/bin/perl 

use strict; use warnings; 

my $s = "\n"; 

if ($s =~ /^[a-z]?$/) { 
    print "string consisting of a single newline matched\n"; 
} 

unless ($s =~ /^[a-z]?\z/) { 
    print "string consisting of a single newline did not match\n"; 
} 
+0

wow merci pour le conseil –

+0

Sinan est un véritable expert. –

+0

@Kinopiko Merci pour le compliment. C'est juste comme ça que j'ai eu ce bâtonnet dans la tête une fois que j'ai été mordu. –

Questions connexes