【发布时间】:2014-04-22 08:24:07
【问题描述】:
我有一个标量变量,我有一些字符串值。现在我想编写一个模式匹配来检查值的格式是否正确。
my $var = "2340";
正确的格式
my $var ="23:40";
我试过了,但不适合我:
/^(0?[1-9]|1[012])(:[0-5]\d
时间可以是 00:00 的格式(格式为 : 之前的 2 位数字和 : 之后的 2 位数字)
【问题讨论】:
我有一个标量变量,我有一些字符串值。现在我想编写一个模式匹配来检查值的格式是否正确。
my $var = "2340";
正确的格式
my $var ="23:40";
我试过了,但不适合我:
/^(0?[1-9]|1[012])(:[0-5]\d
时间可以是 00:00 的格式(格式为 : 之前的 2 位数字和 : 之后的 2 位数字)
【问题讨论】:
您似乎感染了正则表达式,即编码人员在发现正则表达式的强大功能后,尝试将它们用于一切,即使是在它们非常尴尬的情况下使用其他东西会更有意义。
在你的情况下,现成的代码(未经测试,可能有一些语法错误):
if($var =~ /(\d\d):(\d\d)/) {
my $hour = $1; my $min = $2;
if($hour > 23 || $min > 59) {
print "Numbers out of range!";
} else {
#Yay, valid!
}
} else {
print "Invalid date format!";
}
【讨论】:
您的正则表达式似乎是为 12 小时制而不是 24 小时制构建的,您可以尝试以下方法:
^([01]\d|2[0-3])\:([0-5]\d)$
【讨论】:
为什么这么复杂? /^\d\d:\d\d$/ 应该可以检查 2 位数字
您可以使其更复杂以便更好地检查,例如 [0-2][0-9]:[0-6][0-9] 来检查有效数字。正如 cincodenada 指出的那样,应该使用常规代码完成比这更多的验证。
【讨论】: