2

我正在寻找一个正则表达式来匹配javascript中的不同时间格式(用于时间跟踪网络应用程序) 。用户可以使用以下格式之一插入时间:

h
hh:mm
hh.mm

我可以轻松地创建一个正则表达式来匹配 hh:mm 和 hh.mm,但我无法让单小时格式正常工作。

这是我当前的正则表达式: ([0-2][0-9])(.|:)([0-5][0-9])

允许的字符0-9.:。如果用户键入任何其他字符,则验证应该失败。

有没有人有什么建议?

编辑

以下格式应适用于:

小时:毫米(3:30)

解决方案:http ://regexr.com?31gc3

4

7 回答 7

3

您可以通过将块放置在( ... )? This 中来使其成为可选块,这相当于( ... ){0,1}允许零个或一个引用。

你的表达变成:

/([0-2][0-9])((.|:)([0-5][0-9]))?/

这匹配12,12:3012.30。它不会匹配5, 5:30, 或5.30. 可以通过使第一位数字可选来启用单个数字小时输入:

/([0-2]?[0-9])((.|:)([0-5][0-9]))?/

如果你使用.match,你会注意到你有 5 个结果:

["12:30", "12", ":30", ":", "30"]

您可以通过消除不必要的匹配来减少到 3 当你( ... )变成(?: ... )

/([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?/

这给了你:

["12:30", "12", "30"]

更新

根据您的更新,您希望匹配边界。有几种方法可以做到这一点。

  1. 开始^会将表达式的前面与每行/字符串的开头联系起来。
  2. 以结尾结尾$会将表达式的结尾与字符串的结尾联系起来。
  3. 开始或结束\b将要求边缘反对“边界”。

把所有这些放在一起:

如果您只想匹配只包含您可以使用的日期的行:

/^([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?$/

这不会捕获“hello 1.30”或“1.30 hello”。

如果要匹配以日期开头的行,可以使用:

/^([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?/

但这将匹配“1.30000”。

如果您要在行首寻找日期,最好的选择是:

/^([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?\b/

因为它将匹配“1.30 测试”但不匹配“1.300000”。不幸的是,它也会匹配“1.30.30”,但这是 JavaScript 的 RegExp 处理器的限制。

如果您正在寻找字符串中的时间,这将变为:

/\b([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?\b/

它将“test 1.30 test”与“.10.10.10”之类的不幸匹配情况相匹配。

于 2012-07-10T19:04:35.947 回答
2

不确定h是 24 小时还是 12 小时格式,但是 24 小时可以完成工作/^([2][0-3]|[01]?[0-9])([.:][0-5][0-9])?$/,并且 12 小时 - 这个/^([1][0-2]|[0]?[0-9])([.:][0-5][0-9])?$/

于 2012-07-10T19:12:13.030 回答
1

如果您不需要捕获任何内容,只需使用以下命令:

/[0-2]?\d[.:][0-5]\d/

在此处查看实际操作:http ://regexr.com?31g9u


如果要捕获小时和分钟,请使用:

/([0-2]?\d)[.:]([0-5]\d)/

如果您的采集有其他要求,请说明。


更新:我刚刚意识到,如果没有提供分钟,您可能只需要一个数字小时。如果是这种情况,请使用:

/^(?:\d|[0-2]\d[.:][0-5]\d)$/

在此处查看实际操作:http ://regexr.com?31ga1


如果你想匹配类似的东西9:42,但也匹配个位数,使用这个:

/^(?:\d|[0-2]?\d[.:][0-5]\d)$/

在此处查看实际操作:http ://regexr.com?31ga7

于 2012-07-10T19:01:36.367 回答
1

使用这个正则表达式([0-2]\d)(\.|:)([0-5]\d)

于 2012-07-10T19:02:30.167 回答
0

使用 a?使某些东西成为可选的。在你的情况下,你想要类似的东西

([0-1]?[0-9])(\.|:)([0-5][0-9])

添加?允许它接受类似 5:30 的内容。

编辑:另外,.代表任何字符,所以它需要被转义。您也可以使用\d而不是[0-9]

于 2012-07-10T19:01:33.100 回答
0

如果不在右括号之间,点必须被转义 [0-9] 相当于 \d

/(\d|[01]\d|2[0-3])([:.][0-5]\d)?/
于 2012-07-10T19:01:54.023 回答
0

这一个匹配 12 小时时间格式以及仅几个小时。

(([01]?[0-9]|2[0-3])[:.][0-5][0-9])|([01]?[0-9]|2[0-3])

5      Pass
5.55   Pass
01.4   FAIL
01:59  Pass
1:45   Pass

如果你想要 24 小时,冒号之前的部分是([01]?[0-9]|2[0-3])

于 2012-07-10T19:06:47.730 回答