我很乐意接受以下格式:
"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
我做错了什么?谢谢。答案 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);