我想要一个JavaScript正则表达式,它将使用24小时制来匹配时间,其中时间是否带冒号。
例如,我想以下列格式匹配时间:
0800
23:45
2345
但这与无效时间不匹配,例如
34:68
5672
答案 0 :(得分:108)
这应该这样做:
^([01]\d|2[0-3]):?([0-5]\d)$
表达式如下:
^ Start of string (anchor)
( begin capturing group
[01] a "0" or "1"
\d any digit
| or
2[0-3] "2" followed by a character between 0 and 3 inclusive
) end capturing group
:? optional colon
( start capturing
[0-5] character between 0 and 5
\d digit
) end group
$ end of string anchor
答案 1 :(得分:6)
/(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23):?(0|1|2|3|4|5)\d/
:)
答案 2 :(得分:6)
对于军方和民用解决方案,这是一个比上面的更好的解决方案。
军事
^(((([0-1][0-9])|(2[0-3])):?[0-5][0-9])|(24:?00))
我认为或者在最高评级的响应中没有正确地解析子集之前和之后没有额外的括号集来对它们进行分组。另外,我不确定\d
在所有迭代中都只是0-9
。它在技术上包括特殊[[:digit:]]
,虽然我以前从未处理过这个问题。如何,这应该提供包括交叉2400/24:00
平民
^([0-9]|([1][0-2])):[0-5][0-9][[:space:]]?([ap][m]?|[AP][M]?)
这是一个很好的民用版本,允许全范围格式,如12:30 PM,12:30P,12:30 pm,12:30p,12:30 PM,12:30 P,12:30 pm或12 :30 p但要求早晨或子午后字符是相同的情况,如果两者都包括在内(没有Am或pM)。
我在一些JavaScript中使用这两个来验证时间字符串。
答案 3 :(得分:2)
保持冒号可选并允许所有有效时间:
([01]\d|2[0-3]):?[0-5]\d
请注意,这假定午夜永远是0000而不是2400。
答案 4 :(得分:0)
Here's a blog post, looking for the same thing以及一些潜在的答案 - 其中大多数都不起作用,但是对于每个失败的原因都有很好的讨论。
当然,explicitly long and accurate总是有可能!
答案 5 :(得分:0)
这是我刚刚提出的那个:
(^((2[0-4])|([01]?[0-9])):[0-5][0-9]$)|(^((1[0-2])|(0?[1-9])(:[0-5][0-9])?)[pa]m$)
接受:
2pm
4:30am
07:05am
18:45
6:19
00:55
不接受00:05am
- 我不确定是否有时间0am
如果您认为:
是24小时时间格式(军事)的可选项 - 只需在其后添加问号
答案 6 :(得分:0)
我知道这是一个古老的问题,但这是我提出的一个似乎有效的正则表达式。
^(([[0|1]\d)|(2[0-3]))[:]?([0-5]\d)$
您可以对其进行编辑on this regex site
修改强> 我刚刚意识到这个答案最终与接受的答案完全相同,但我会留在这里,至少是为了“自己动手”链接的价值
答案 7 :(得分:0)
这很完美:
^0?([0-9][0-2]?):[0-5][0-9]$
注意:仅12小时时钟
对于像时代这样:
0:01- 12:59
00:01 - 12:59
答案 8 :(得分:0)
人类友好版本:
^([0-1][0-9]|2[0-3]):?([0-5][0-9])$
答案 9 :(得分:-1)
/^(?:[01]\d|2[0-3]):?[0-5]\d$/
答案 10 :(得分:-1)
我不认为正则表达式是解决此问题的正确方法。当然,它可以完成,但它似乎错了。
确保您的字符串长度为四个字符,或者中间有一个冒号的5个字符。然后,解析每一面,确保左侧小于24,右侧小于60.
正则表达式解决方案要复杂得多。
答案 11 :(得分:-1)
如果字符串中包含':'
,则删除"DDDD"
,如果字符串的格式为int
,则将其转换为{{1}}并将其与2400进行比较。