【问题标题】:Regex pattern mismatches while checking time format检查时间格式时正则表达式模式不匹配
【发布时间】:2014-05-31 12:10:04
【问题描述】:

我愿意接受以下格式:

"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

我做错了什么?谢谢。

【问题讨论】:

标签: c# regex time-format


【解决方案1】:

您在整个表达式的开头和结尾锚点之间缺少一组括号:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多