我可以将这两个正则表达式合二为一吗?

时间:2012-05-14 09:26:30

标签: regex perl

我的应用程序的数据库记录具有十位数的ID,并且可以通过"""0000000000"指示空值。目前,我使用以下习惯来检查有效ID:

my $is_valid = $id =~ m/[0-9]{10}/ && $id =~ /[1-9]/;

第一个正则表达式检查整体格式,第二个正则表达式通过查找字符串中某处的非空数字来排除"0000000000"值。我很好奇是否可以将这两个正则表达式合二为一。

一个正则表达式可能效率会降低,但正如我所说,我只是好奇它是否可行。

5 个答案:

答案 0 :(得分:5)

这需要lookahead assertion(为了清晰起见,将正则表达式分解为多行):

if ($id =~ 
    m/\A      # Anchor the match to the start of the string
    (?!0*\z)  # Assert that it's impossible to match only zeroes until end-of-str
    [0-9]{10} # Match exactly 10 digits
    \z        # Anchor the match to the end of the string
    /x)       # (verbose regex)
    {
    # Successful match
}

答案 1 :(得分:2)

我很好奇你是如何设法将10位数ID与

匹配的
my $is_valid = $id =~ m/[0-9]{11}/ && $id =~ /[1-9]/;

..因为这只匹配11位数ID。如果第一个参数为false,则&&运算符会短路,因此永远不会检查第二个参数。

我要做的是编写一个小子程序来处理验证:

sub is_valid_id {
    my $id   = shift;
    return 0 if (length($id) != 10);           # assert length
    return 0 unless $id =~ /^[0-9]+$/;         # assert numeric
    return 0 unless $id =~ /[1-9]/;            # assert at least 1 non-zero digit
    return 1;
}

这可能看起来过于冗长,但我认为在这种情况下以明确的方式陈述每项要求是个好主意。

至于好奇心,我认为Tim Pietzcker已经找到了将两者结合起来的正则表达式。

答案 2 :(得分:1)

为什么要使用正则表达式检查常量字符串?只需比较它们:

my $is_valid = $id =~ m/[0-9]{11}/ && $id ne "0000000000";

答案 3 :(得分:-1)

/0{0}[1-9][0-9]{10}|0{1}[1-9][0-9]{9}|0{2}[1-9][0-9]{8}|...|0{10}[1-9][0-9]{0}/

答案 4 :(得分:-1)

更容易检查 $ id> 0 但如果你想要regexp试试这个

my $is_valid = $id =~ /0*[1-9]+/;

但两种变体都没有检查$ id是否只有11位数。