如何使用正则表达式验证月份输入?

时间:2010-01-26 07:05:15

标签: regex perl

我正在设置此示例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等...给出了什么?

9 个答案:

答案 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日期格式

来源:http://www.regular-expressions.info/dates.html

答案 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]