RegEx检查24小时时间格式失败

时间:2019-04-23 08:06:38

标签: regex

我有以下正则表达式,应该进行24小时格式验证,我正在https://rubular.com

中进行尝试
/^[0-23]{2}:[0-59]{2}:[0-59]{2}$/

但是以下时间即使看起来正确也无法匹配

02:06:00
04:05:00

为什么会这样?

3 个答案:

答案 0 :(得分:2)

在字符类中,您应该表示允许的字符范围(与示例中要匹配的数字相反)。在几分钟和几秒钟内,这相对简单-以下表达式

[0-5][0-9]

...将匹配从“ 00”到“ 59”的任何数字字符串。

但是在小时中,您需要两个单独的表达式:

[01][0-9]|2[0-3]

...一个将“ 00”匹配到“ 19”,另一个将“ 20”匹配到“ 23”。由于使用了替代字符(|字符),因此需要对它们进行分组,这又增加了语法(?:...)的位。最后,我们只是在字符串的开头和结尾添加锚点^$,您已经有了它们所在的位置。

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

如果愿意,您可以选中此solution out at regex101

答案 1 :(得分:2)

您的问题是您理解字符范围错误:0-23并不意味着“匹配从0到23的任何数字”,它意味着:0-2-匹配一位数字:0,1或2 ,然后匹配3。

尝试以下模式:(?:[01][0-9]|2[0-3])(?::[0-5][0-9]){2}

说明:

(?:...)-非捕获组

[01][0-9]|2[0-3]-交替:匹配是0还是1,然后是0到9之间的任意数字 OR 2后面是0、1、2或3(00-23之间的数字)< / p>

(?::[0-5][0-9]){2}-匹配:[0-5][0-9](基本上是从00-59的数字)两次

Demo

答案 2 :(得分:1)

使用此(([0-1]\d|[2][0-3])):(([0-5][0-9])):(([0-5][0-9]))

Online demo