我正在设置此示例Perl代码段以验证日期中的几个月:
我想接受的一些场景是:
MM 中号
#!/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");
当我运行它时,它正确地从01-12过滤,但是当我将正则表达式更改为:
时$month = "(0?[1-9]|1[012])";
然后正则表达式允许13,14等...给出了什么?
答案 0 :(得分:31)
如果你真的想使用正则表达式,你需要把^和$,比如
"^(0?[1-9]|1[012])$"
它不匹配13,14 ....
答案 1 :(得分:17)
您不应使用正则表达式进行数值范围验证。你想要的正则表达式是:
/^(\d+)$/
然后,
if ($1 >= 1 && $1 <= 12) {
# valid month
}
这比任何正则表达式更容易阅读以验证数值范围。
另外,Perl通过在目标中搜索来评估正则表达式,以获得匹配的表达式。所以:
/(0[1-9]|1[012])/
搜索0后跟1到9,或1搜索后跟0,1或2.这将匹配“202”,例如许多其他数字。另一方面:
/(0?[1-9]|1[012])/
搜索可选的0 1到9,或1搜索后跟0,1或2.所以“13”在这里匹配,因为它包含1,匹配正则表达式的前半部分。要使正则表达式按预期工作,
/^(0?[1-9]|1[012])$/
^
和$
分别将搜索锚定到字符串的开头和结尾。
答案 2 :(得分:4)
为了给你提示 - 月号“120”也在你的版本中匹配: - )
变化:
my $month = "(0[1-9]|1[012])";
到
my $month = /^(0[1-9]|1[012])$/;
然后用它玩更多
答案 3 :(得分:2)
不要使用正则表达式。
Perl能够根据上下文自动评估为数字或字符串。 01-09将在数值上下文中评估为1-9。因此,您只需检查一个值:
print "Enter in a month: ";
chomp($pattern = <STDIN>);
# We only want to print if the pattern matches
print "Pattern matches\n" if ($pattern < 13 && $pattern > 0);
答案 4 :(得分:1)
"^(1[012]|0?[1-9])$"
会更好,因为正则表达式首先进行评估。假设你想匹配'12'而你写"^(0?[1-9]|1[012])$"
,那么将选择'1',因为0?[1-9]
首先被采用。
答案 5 :(得分:0)
这是一种方式
while(1){
print "Enter in a month: ";
$pattern = <STDIN>;
chomp($pattern);
if ($pattern =~ /^(Q|q)$/ ){last;}
if ($pattern =~ /^[0-9]$/ || $pattern =~ /^[0-9][12]$/ ) {
print "Pattern matches\n";
}else{
print "try again\n";
}
}
输出
$ perl perl.pl
Enter in a month: 01
Pattern matches
Enter in a month: 000
try again
Enter in a month: 12
Pattern matches
Enter in a month: 00
try again
Enter in a month: 02
Pattern matches
Enter in a month: 13
try again
Enter in a month:
答案 6 :(得分:0)
(0 [1-9] | 1 [012])
parens是如此,你可以在另一个块中使用它,例如,如果匹配整个yyyy-MM-dd日期格式
答案 7 :(得分:0)
测试month
/ year
:
^(0?[1-9]|1[012])\/([2-9][0-9)]{3})$
答案 8 :(得分:-1)
[^d>12|d<0] OR ^[d>12|d<0]