【发布时间】:2010-11-14 11:55:08
【问题描述】:
如何在正则表达式中匹配 12 小时时间 - 换句话说,匹配 12:30 但不匹配 14:74? 谢谢!
【问题讨论】:
-
我试过这个:(1?[0-9]):([0-9]{2}) 但匹配 14:74!
如何在正则表达式中匹配 12 小时时间 - 换句话说,匹配 12:30 但不匹配 14:74? 谢谢!
【问题讨论】:
这应该可行:
([1-9]|1[012]):[0-5][0-9]
【讨论】:
这是一个问题示例,其中“嘿,我知道,我将使用正则表达式!”是错误的解决方案。您可以使用正则表达式检查您的输入格式是否为 digit-digit-colon-digit-digit,然后使用编程逻辑确保值在您期望的范围内。例如:
/(\d\d?):(\d\d)/
if ($1 >= 1 && $1 <= 12 && $2 < 60) {
// result is valid 12-hour time
}
这比您在此处的其他答案中看到的一些混淆的正则表达式示例更容易阅读和理解。
【讨论】:
^(00|0[0-9]|1[012]):[0-5][0-9] ?((a|p)m|(A|P)M)$
^ - 匹配字符串的开头。
(00|0[0-9]|1[012]) - 最多 12 位的任意两位数。需要两位数。
: - 匹配冒号
[0-5][0-9] - 匹配从 00 到 59 的任何两位数。
? - 匹配空格零次或一次。
((a|p)m|(A|P)M) - 匹配上午或下午,不区分大小写。
$ - 匹配字符串的结尾。
【讨论】:
像这样:((?:1[0-2]|0\d)\:(?:[0-5]\d)) 如果你想在小时内领先 0,((?:1[0-2]|\d)\:(?:[0-5]\d)) 如果你不想,((?:1[0-2]|0?\d)\:(?:[0-5]\d)) 如果你不在乎。
【讨论】:
为什么是正则表达式?你可以这样做将简单的整数检查
$str = "12:74";
list($h , $m ) = explode(":",$str);
if ( ($h <=12 && $h >=0 ) && ($m <=59 && $m >=0) ) {
print "Time Ok.";
}else{
print "Time not ok";
}
【讨论】:
$str 等于 "foozah",它会破坏你的脚本(因为没有索引 1)。另外,如果$str 等于"foo:zah",您的脚本会说它是 一个有效时间,但我认为不是这样。
我相信上述方法至少在一种方式上失败了,尤其是对于诸如“13:00”之类的字符串(在这种情况下,Keith 匹配“3:00”)。
这个问题应该和其他提出的问题一样处理。
([01][0-2]|(?<!1)[0-9]):([0-5][0-9])
【讨论】:
(0?\d|1[0-2]):([0-5]\d)
这将匹配从 0:00 到 12:59 的所有内容。顺便说一句,那是13个小时。如果您不想匹配 0:00 - 0:59,请尝试以下操作:
([1-9]|1[0-2]):([0-5]\d)
【讨论】:
你可以用这个:
/((?:1[0-2])|(?:0?[0-9])):([0-5][0-9]) ?([ap]m)/
/1 => hour
/2 => minute
/3 => am/pm
【讨论】:
以下匹配 24 小时制(即 00:00 - 23:59)00:00 到 12:59 之间的填充时间和非填充时间。
(?:(?<!\d)[0-9]|0[0-9]|1[0-2]):[0-5][0-9]
匹配:
不匹配:
【讨论】:
^(?:(?:1?(?:[0-2]))|[1-9]):[0-5][0-9]
【讨论】:
这是一个包含上午和下午验证的 12 小时模式。
TIME12HOURSAMPM_PATTERN = "^(?:(?<!\\d)[0-9]|0[0-9]|1[0-2]):[0-5][0-9] ?((a|p)m|(A|P)M)$";
【讨论】: