1

我的应用程序的数据库记录有十位数的 ID,空值可以用""或表示"0000000000"。目前,我使用以下习惯用法来检查有效 ID:

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

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

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

4

5 回答 5

5

这需要先行断言(为清楚起见,正则表达式分为多行):

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
}
于 2012-05-14T10:18:30.567 回答
2

我很好奇您是如何将 10 位数字 ID 与

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

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

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

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 已经找到了将两者结合起来的正则表达式。

于 2012-05-14T11:00:17.223 回答
1

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

my $is_valid = $id =~ m/[0-9]{11}/ && $id ne "0000000000";
于 2012-05-14T09:50:20.587 回答
-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}/

于 2012-05-14T09:32:33.093 回答
-1

更容易检查$id>0 但如果你想要正则表达式试试这个

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

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

于 2012-05-14T10:44:11.660 回答