简单地添加 $ 解决了最初允许一天多于两位数的问题,但引入了一个更微妙的错误:尽管末尾有换行符,日期现在仍然可以验证。根据您的应用程序,这可能无关紧要,但可以通过使用以下示例中的正则表达式来避免:
use strict;
use warnings;
my @tests = (
'2012_4_123',
'2012_11_22',
"2012_11_22\n",
);
use Data::Dumper;
print Dumper \@tests;
foreach my $test (@tests) {
if ( $test !~ m/\A(\d{4})_(\d{1,2})_(\d{1,2})\z/smx )
{
print "invalid format\n";
}
else
{
print "valid format\n";
}
}
注意:/smx
是Perl Best Practices推荐的,我用它来编写我的正则表达式,除非有特定的需要不需要它,但如果你不习惯它,它可能会让你绊倒。
/s
并/m
允许您更轻松地处理多行字符串;/s
因为.
然后将匹配换行符并/m
允许您分别使用^
和$
匹配行的开头和结尾,\A
然后\z
将匹配整个字符串的开头和结尾。
/x
只是允许正则表达式中的空格和注释,但如果你真的想匹配它,你需要转义空格。
在这种情况下,无论\z
使用.$
/smx
此外,查看一个模块来执行日期验证而不仅仅是日期格式验证可能不是一个坏主意(同样,这取决于您使用它的目的)。请参阅有关 perlmonks 的讨论。