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

Javascript 正则表达式:匹配hh:mm、hh.mm或h,javascript,regex,datetime,datetime-format,datetime-parsing,Javascript,Regex,Datetime,Datetime Format,Datetime Parsing,我正在寻找一个正则表达式来匹配javascript中不同的时间格式(对于时间跟踪web应用程序)。用户可以使用以下格式之一插入时间: h hh:mm hh.mm 我可以很容易地创建一个正则表达式来匹配hh:mm和hh.mm,但是我无法使单小时格式工作 这是我当前的正则表达式: ([0-2][0-9])(.|:)([0-5][0-9]) 允许的字符:0-9、和:。 如果用户键入任何其他字符,验证将失败 有人有什么建议吗 编辑 以下格式应适用于: h:mm(3:30) 解决方案:使用?使某些内容成

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

h
hh:mm
hh.mm
我可以很容易地创建一个正则表达式来匹配hh:mm和hh.mm,但是我无法使单小时格式工作

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

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

有人有什么建议吗

编辑

以下格式应适用于:

h:mm(3:30)


解决方案:

使用
使某些内容成为可选内容。在你的情况下,你想要

([0-1]?[0-9])(\.|:)([0-5][0-9])
添加
允许它接受类似5:30的内容


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

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

/[0-2]?\d[.:][0-5]\d/
/([0-2]?\d)[.:]([0-5]\d)/
/^(?:\d|[0-2]\d[.:][0-5]\d)$/
/^(?:\d|[0-2]?\d[.:][0-5]\d)$/
在这里看到它的作用:


如果要捕获小时和分钟,请使用以下命令:

/[0-2]?\d[.:][0-5]\d/
/([0-2]?\d)[.:]([0-5]\d)/
/^(?:\d|[0-2]\d[.:][0-5]\d)$/
/^(?:\d|[0-2]?\d[.:][0-5]\d)$/
如果您的捕获有其他要求,请指定


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

/[0-2]?\d[.:][0-5]\d/
/([0-2]?\d)[.:]([0-5]\d)/
/^(?:\d|[0-2]\d[.:][0-5]\d)$/
/^(?:\d|[0-2]?\d[.:][0-5]\d)$/
在这里看到它的作用:


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

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

请参见此处的操作:

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

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

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

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

你的表情变成:

/([0-2][0-9])((.|:)([0-5][0-9]))?/
这与
12
12:30
12.30
相匹配。它与
5
5:30
5.30
不匹配。启用一位数小时输入可以通过将第一位数设为可选来完成:

/([0-2]?[0-9])((.|:)([0-5][0-9]))?/
如果您使用的是
.match
,您会发现有5个结果:

["12:30", "12", ":30", ":", "30"]
当您将
(…)
转换为
(?:…)
时,可以通过消除不必要的匹配将其减少到3

这将为您提供:

["12:30", "12", "30"]
更新

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

  • ^
    开头将把表达式的前面与每行/字符串的开头联系起来
  • $
    结尾将把表达式的结尾与字符串的结尾联系起来
  • \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”之类的匹配内容的不幸案例相匹配。

    这一个匹配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])
    不确定
    h
    是24小时格式还是12小时格式,但对于24小时,这将完成任务
    /([2][0-3]|[01]?[0-9])([.:][0-5][0-9])?$/
    和12小时-此
    /([1][0-2]?[0-9]([0-9])([0-9])?$/

    你想捕捉什么?没错。其他答案肯定使这更接近于关于精确匹配的逻辑结论。我对使匹配成为可能的语言特性更感兴趣。这还不错。没有用户尝试在时间跟踪系统中记录27小时30分钟。。。如果他们尝试了,日志文件会提醒:)你的正则表达式有问题:数字和字母的混合也是正确的:已更新。这解决了这样一种情况,即您试图找到的时间不仅包括整行时间,还包括行的开始和中间时间。JavaScript中存在一些错误匹配的限制,但应该加以限制。这将匹配
    4.3
    。您需要避免使用
    [0-5]?
    中的
    。而且,
    [0-1]
    可以减少到
    [01]
    。我已经纠正了它。当然,它将匹配甚至4:14,这不适合格式hh:mm或hh.mm,但我认为系统必须更智能(即在开始时添加零),而不是限制用户。