我的应用程序的数据库记录具有十位数的ID,并且可以通过""
或"0000000000"
指示空值。目前,我使用以下习惯来检查有效ID:
my $is_valid = $id =~ m/[0-9]{10}/ && $id =~ /[1-9]/;
第一个正则表达式检查整体格式,第二个正则表达式通过查找字符串中某处的非空数字来排除"0000000000"
值。我很好奇是否可以将这两个正则表达式合二为一。
一个正则表达式可能效率会降低,但正如我所说,我只是好奇它是否可行。
答案 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位数。