检查时间格式时正则表达式模式不匹配

时间:2014-04-16 14:33:34

标签: c# regex time-format

我很乐意接受以下格式:

"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

我做错了什么?谢谢。

2 个答案:

答案 0 :(得分:2)

在整个表达式中,在行首和行结束之间缺少一组括号括号:

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

没有括号,你的正则表达式基本上是这样说:

  • 匹配^([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]))$

答案 1 :(得分:0)

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

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