检查时间格式时Regex模式不匹配

本文关键字:模式 不匹配 Regex 时间 格式 检查 | 更新日期: 2023-09-27 17:58:33

我很乐意接受以下格式:

"23:59", "2:3:04", "02:00:09", "23:07:00"

使用此正则表达式模式:

return Regex.IsMatch(timeIn, @"^([0-2]?[0-9]:[0-5]?[0-9])|([0-2]?[0-9]:[0-5]?[0-9]:[0-5]?[0-9])$") ? true : false;

不幸的是,它也接受其他格式,例如:00:00:99

我做错了什么?非常感谢。

检查时间格式时Regex模式不匹配

在行首和行尾锚点之间,整个表达式缺少一组圆括号:

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

如果没有括号,您的regex本质上是在说:

  • 匹配^([0-2]?[0-9]:[0-5]?[0-9])
  • ([0-2]?[0-9]:[0-5]?[0-9]:[0-5]?[0-9])$

因此,00:00:99将是有效的,与正则表达式的第一部分匹配。还有,类似的东西:99:00:00:00,它将与第二部分相匹配。

也就是说,您的正则表达式仍然会匹配一些不需要的模式,例如:29:00

一个改进的版本是:

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

虽然它没有直接回答这个问题,但我想说,在这样的标准情况下,我宁愿使用内置函数,也不愿创建真正可怕的正则表达式:

DateTime.TryParseExact(input, "H:m:s", CultureInfo.InvariantCulture, DateTimeStyles.None, out d);