我正在寻找一个正则表达式来匹配不同的时间格式(对于时间跟踪网络应用程序)在javascript中。用户可以使用以下格式之一插入时间:
h
hh:mm
hh.mm
我可以轻松创建一个正则表达式来匹配hh:mm和hh.mm,但我无法使单小时格式工作。
这是我现在的正则表达式:
([0-2][0-9])(.|:)([0-5][0-9])
允许的字符:0-9
,.
和:
。
如果用户键入任何其他字符,则验证失败。
有人有任何建议吗?
修改
以下格式应该适用于:
h:mm(3:30)
答案 0 :(得分:3)
您可以通过将其置于( ... )?
中来设置可选块。这相当于允许零或一个引用的( ... ){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"]
当您将( ... )
转换为(?: ... )
/([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?/
这会给你:
["12:30", "12", "30"]
<强>更新强>
根据您的更新,您希望匹配边界。有几种方法可以做到这一点。
^
开始会将表达式的前面绑定到每行/字符串的开头。$
结尾会将表达式的结尾绑定到字符串的末尾。\b
开头或结尾将强制边缘对抗“边界”。把所有这些放在一起:
如果您只想匹配除了可以使用的日期之外的其他行:
/^([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])