Perl正则表达式导致编译错误

时间:2013-12-09 14:34:58

标签: regex perl

对Perl来说很新,并且日期验证有问题

我运行以下子程序以检查用户日期输入是否符合YYYY-MM-DD

sub validateDate {
    VALIDATE-DATE: {
        $date = <STDIN>;
        if ($date !~ 
             /^(19|20)\d\d([-  /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$/) {
            print " $userStart in incorrect format, should be yyyy-mm-dd\n"
            print " Would you like to re-enter a date press (Y or N)?\n";
            my $choice = <STDIN>;
            if ($choice =~ /[Yy]/) {
                redo VALIDATE_DATE;
            } else {
                exit;
            }
        }
        return $date;
    }
}

然而,当我运行它时,我收到此错误:

Unmatched [ in regex; marked by <-- HERE in m/^(19|20)\d\d([ <-- HERE - / at common_subs.pl line 60. Compilation failed in require at add.pl line 7.

错误说有一个无与伦比的'['但事实并非如此。我认为正则表达式本身有问题吗?我从一个单独的文件中调用sub。

2 个答案:

答案 0 :(得分:4)

首先,逃避//用作正则表达式文字的分隔符。该文字中的/应该被转义。

/^(19|20)\d\d([-  \/.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$/
#                 ^^

或使用不同的分隔符:

m{^(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$}

以下行缺少终止;

print " $userStart in incorrect format, should be yyyy-mm-dd\n";
#                                                              ^

答案 1 :(得分:3)

事实上,你的正则表达式确实缺少]

由于/是分隔符号,perl编译器会停留在正则表达式中未转义的斜杠上,这样你的正则表达式就会像这样:

/^(19|20)\d\d([-  /

显然缺少]; - )

使用不同的分隔符(通常是人们使用!或类似的东西)或者只是逃避斜杠。