我的应用程序的数据库记录有十位数的 ID,空值可以用""
或表示"0000000000"
。目前,我使用以下习惯用法来检查有效 ID:
my $is_valid = $id =~ m/[0-9]{10}/ && $id =~ /[1-9]/;
"0000000000"
第一个正则表达式检查整体格式,第二个正则表达式通过在字符串中的某处查找非空数字来排除该 值。我很好奇我是否可以将这两个正则表达式合二为一。
那一个正则表达式可能效率较低,但正如我所说,我只是好奇它是否可行。
这需要先行断言(为清楚起见,正则表达式分为多行):
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
}
我很好奇您是如何将 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 已经找到了将两者结合起来的正则表达式。
为什么要使用正则表达式来检查常量字符串?只需比较它们:
my $is_valid = $id =~ m/[0-9]{11}/ && $id ne "0000000000";
/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}/
更容易检查$id>0 但如果你想要正则表达式试试这个
my $is_valid = $id =~ /0*[1-9]+/;
但两种变体都没有检查 $id 是否正好有 11 位数字。