正则表达式:匹配hh:mm,hh.mm或h

时间:2012-07-10 18:58:26

标签: javascript regex datetime datetime-format datetime-parsing

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

h
hh:mm
hh.mm

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

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

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

有人有任何建议吗?

修改

以下格式应该适用于:

h:mm(3:30)

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

7 个答案:

答案 0 :(得分:3)

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

你的表达成为:

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

匹配1212:3012.30。它与55:305.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开头或结尾将强制边缘对抗“边界”。
  4. 把所有这些放在一起:

    如果您只想匹配除了可以使用的日期之外的其他行:

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

    这不会捕获“你好1.30”或“1.30你好”。

    如果您想匹配以您可以使用的日期开头的行:

    /^([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”之类的不幸案例相匹配。

答案 1 :(得分: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])?$/

答案 2 :(得分:1)

如果你不需要捕捉任何东西,只需使用:

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

在此处查看:[{3}}


如果您想捕捉小时和分钟,请使用:

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

如果您的捕获有其他要求,请指明。


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

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

在此处查看:[{3}}


如果您想匹配9:42之类的内容,但也匹配单个数字,请使用以下命令:

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

在此处查看:[{3}}

答案 3 :(得分:1)

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

答案 4 :(得分:0)

使用?制作可选内容。在你的情况下,你想要像

这样的东西
([0-1]?[0-9])(\.|:)([0-5][0-9])

添加?可以接受类似5:30的内容。

编辑:此外,.代表任何字符,因此需要进行转义。您也可以使用\d代替[0-9]

答案 5 :(得分:0)

如果不在右括号[0-9]等同于\ d

之间,则必须转义点
/(\d|[01]\d|2[0-3])([:.][0-5]\d)?/

答案 6 :(得分: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])