Comment puis-je utiliser une expression régulière pour valider la saisie du mois?
Je suis la configuration de cet exemple Perl extrait de les valider par mois dans une date:
Certains scénarios, je veux accepter sont:
MM
M
#!/usr/bin/perl
use strict;
use warnings;
my $pattern;
my $month = "(0[1-9]|1[012])";
my $day = "(0[1-9]|[12]\d|3[01])";
system("cls");
do {
print "Enter in a month: ";
chomp($pattern = <STDIN>);
# We only want to print if the pattern matches
print "Pattern matches\n" if ($pattern =~ /$month/);
} while ($pattern ne "Q");
Lorsque je l'exécute, il correctement les filtres de 01-12 mais lorsque je change la regex:
$month = "(0?[1-9]|1[012])";
puis la regex permet 13, 14, etc... ce qui donne?
source d'informationauteur coson
Vous devez vous connecter pour publier un commentaire.
Si vous aimez vraiment à utiliser les regex, vous avez besoin de mettre le ^ et le $, comme
"^(0?[1-9]|1[012])$"
il ne sera pas le match 13, 14 ....
Vous ne devriez pas utiliser une expression régulière pour faire plage numérique de validation. L'expression régulière que vous voulez est:
Puis,
C'est beaucoup plus facile à lire que toute expression régulière pour valider une plage numérique.
En aparté, Perl évalue des expressions régulières en recherche à l'intérieur de la cible pour une contrepartie d'expression. Donc:
recherches pour un 0 suivi de 1 à 9, ou un 1 suivi par 0, 1, ou 2. Cela pourrait correspondre à "202" par exemple, et beaucoup d'autres numéros. Sur l'autre main:
recherche une option 0 1 à 9, ou un 1 suivi par 0, 1, ou 2. Donc, "13" correspond ici car il contient un 1, correspondant à la première moitié de la regex. Pour faire de vos expressions régulières de travail comme vous le souhaitez,
La
^
et$
d'ancrage de la recherche pour le début et la fin de la chaîne, respectivement.Pour vous donner de l'indice - numéro du mois "120" correspond à votre version 🙂
Changement:
à
et puis jouer plus avec elle
Ne pas utiliser des expressions régulières.
Perl a la capacité d'évaluer automatiquement comme un nombre ou une chaîne basée sur le contexte. 01-09 permettra d'évaluer de 1 à 9 dans le contexte numérique. Ainsi, vous pouvez vérifier simplement une valeur:
"^(1[012]|0?[1-9])$"
serait mieux parce que l'expression régulière est évalué tout d'abord une première. Disons que vous voulez faire correspondre '12', et vous écrivez
"^(0?[1-9]|1[012])$"
, puis " 1 " seront choisis parce que0?[1-9]
est pris en premier.voici une façon
sortie
(0[1-9]|1[012])
les parens sont si vous pouvez l'utiliser à l'intérieur d'un autre bloc, par exemple, si l'option pour l'ensemble d'une aaaa-MM-jj date format
source: http://www.regular-expressions.info/dates.html
Pour tester
month
/year
: