Javascript 正则表达式:匹配hh:mm、hh.mm或h
我正在寻找一个正则表达式来匹配javascript中不同的时间格式(对于时间跟踪web应用程序)。用户可以使用以下格式之一插入时间: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) 解决方案:使用?使某些内容成
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,但我认为系统必须更智能(即在开始时添加零),而不是限制用户。