Javascript 军用(24小时)格式的匹配时间正则表达式

Javascript 军用(24小时)格式的匹配时间正则表达式,javascript,regex,time,Javascript,Regex,Time,我想要一个JavaScript正则表达式,它将使用24小时时钟匹配时间,其中时间是带冒号或不带冒号的 例如,我希望以以下格式匹配时间: 0800 23:45 2345 但这与无效时间不匹配,例如 34:68 5672 :)我认为正则表达式不是解决这个问题的正确方法。当然,这是可以做到的,但似乎是错的 确保字符串长度为四个字符,或者中间有冒号的5个字符。然后,分析每一侧,确保左侧小于24,右侧小于60 正则表达式解决方案要复杂得多。这应该可以做到: ^([01]\d|2[0-3]):?([

我想要一个JavaScript正则表达式,它将使用24小时时钟匹配时间,其中时间是带冒号或不带冒号的

例如,我希望以以下格式匹配时间:

  • 0800
  • 23:45
  • 2345
但这与无效时间不匹配,例如

  • 34:68
  • 5672

:)

我认为正则表达式不是解决这个问题的正确方法。当然,这是可以做到的,但似乎是错的

确保字符串长度为四个字符,或者中间有冒号的5个字符。然后,分析每一侧,确保左侧小于24,右侧小于60

正则表达式解决方案要复杂得多。

这应该可以做到:

^([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

要使冒号保持可选并允许所有有效时间,请执行以下操作:

([01]\d|2[0-3]):?[0-5]\d
请注意,这假设午夜总是0点,而不是2400点。

和一系列可能的答案——其中大多数都不起作用,但关于每个答案失败的原因,有很好的讨论


当然,总是有可能的

删除
:'
如果字符串有一个,那么如果字符串的形式是
“ddddd”
,将其转换为
int
,并将其与2400进行比较。

这是我刚刚提出的一个:

(^((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小时时间格式(军用)是可选的-只需在其后面添加一个问号

对于军用和民用解决方案,这里有一个比上面的解决方案更好的解决方案

军事的

^(((([0-1][0-9])|(2[0-3])):?[0-5][0-9])|(24:?00))
我相信最高级别响应中的or没有正确地解析之前和之后的子集,而没有额外的括号对它们进行分组。另外,我不确定在所有迭代中,
\d
只是
0-9
。从技术上讲,它包括特殊的
[[:digit:]
,尽管我以前从未处理过这一问题。无论如何,这应该提供一切,包括2400/24:00的交叉

平民

^([0-9]|([1][0-2])):[0-5][0-9][[:space:]]?([ap][m]?|[AP][M]?)
这是一个很好的民用版本,允许完整范围的格式,如12:30PM、12:30P、12:30PM、12:30PM、12:30P、12:30PM或12:30P,但如果包含上午或后子午线字符(无上午或下午),则要求其大小写相同


我在一点JavaScript中使用这两种方法来验证时间字符串。

我知道这是一个老问题,但我提出了一个正则表达式,它似乎有效

^(([[0|1]\d)|(2[0-3]))[:]?([0-5]\d)$
你可以编辑它

编辑 我刚刚意识到,这个答案与公认的答案完全相同,但我将把它留在这里,至少是因为“自己动手”链接的价值这是完美的:

^0?([0-9][0-2]?):[0-5][0-9]$
注:仅12小时时钟

例如:

0:01- 12:59
00:01 - 12:59


赞成举例子和反例。你没有选择冒号。谢谢。我打字太快了,所以我忘了:)这个答案比公认的要好得多。已接受的一个在没有注释的情况下不可读,正则表达式简化为:
/([01]\d | 2[0-3]):?[0-5]\d/
。24:00不存在,但已匹配。将
[0-4]
更改为
[0-3]
。或以以下形式:^([0-9])|([0-1][0-9])|([2][0-3]):?([0-5][0-9])如果您不喜欢\d的内容:)strager:24:00完全有效,指的是一天的确切结束时间(从技术上讲是第二天的0:00)。看@strager,中午12点和12点也不看,但人们一直在使用它们…;-)是的,他可以生成一个数组的所有可能时间(应该小于16k),然后它只是一个比较=),你没有读过其他文章吗?尝试了无数次,几乎没有人能正确地解决问题(甚至完全理解问题)。我的解决方案在任何语言或实现中都很难搞乱。哦,也有很多方法可以搞乱您的解决方案。特别是如果你想像我们一样快速打字,有很多方法会把事情搞砸吗?当然容易搞砸吗?不,容易发现错误吗?对正则表达式?编号2380无效。你必须按照我的建议比较两方面。谢谢,我喜欢这个。不过,我确实在结尾加了美元。此外,我在开始时将0设置为可选(即01:25可以是1:25)。希望一路上没有把事情搞砸^([0-1]?[0-9])|(2[0-3]):?[0-5][0-9])|(24:00))$民用的似乎不起作用。如果您将其放入并尝试12:30p,则不会返回匹配项。在regex101.com中工作正常。也许是你弄错了,而不是复制/粘贴了?Regexr.com在移动设备上不起作用,否则我会检查。regex的结尾没有限制,它允许在结尾输入其他字符,并且仍然匹配,例如13:4502938抱歉:这是完美的:(([0-9][0-2]?)|([0][0-9]):[0-5][0-9]$
^0?([0-9][0-2]?):[0-5][0-9]$
0:01- 12:59
00:01 - 12:59