我的正则表达式与yyyy-mm-ddThh:mm:ss不匹配

时间:2015-04-23 14:21:54

标签: regex datetime

我试过了

^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|12[0-9]|3[01]T(0[0-9]|1[0-9]|2[0123]):(0[0-9]|12345[0-9]):(0[0-9]|12345[0-9]))$

^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|12[0-9]|3[01][T](0[0-9]|1[0-9]|2[0123])[:](0[0-9]|12345[0-9])[:](0[0-9]|12345[0-9]))$

并且它们都没有在样本日期时间工作 - 2009-06-15T13:45:30

3 个答案:

答案 0 :(得分:2)

您错过了一个括号,并在最后添加了一个:

^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[[12][0-9]|3[01])T(0[0-9]|1[0-9]|2[0123]??):(0[0-9]|[12345][0-9]):(0[0-9]|[12345][0-9])$ 
//                          add parenthesis here       __^                                           and delete the one here __^

您也可以简化为:

^(19|20)\d\d-(0[1-9]|1[012])-([012]\d|3[01])T([01]\d|2[0-3]):([0-5]\d):([0-5]\d)$ 

另一种只测试格式然后测试有效性的方法是:

^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)$

然后测试有效性:

  • 1900年至2000年之间的第1组
  • group2在01和12之间
  • group3在01和31之间
  • group4在00和23之间
  • group5在00和59之间
  • group6在00和59之间

或者,更好的是,使用日期解析器;我有一个以您最喜欢的语言存在的。

答案 1 :(得分:0)

你当天第12部分[0-9]就是问题所在。可能意味着[12] [0-9]

答案 2 :(得分:0)

托托的答案解决了你所有的问题,但没有告诉你原因。

你有4个错误:

  1. 错误地放置括号

    (0[1-9]|12[0-9]|3[01]T -> (0[1-9]|12[0-9]|3[01])T

  2. 小时第一位数字缺少括号

    (0[1-9]|12[0-9]|3[01]) -> (0[1-9]|[12][0-9]|3[01])

  3. 秒数第一位数字缺少括号

    (0[0-9]|12345[0-9]) -> (0[0-9]|[12345][0-9])

  4. 最后错位的括号

    (0[0-9]|12345[0-9]))$ -> (0[0-9]|12345[0-9])$

  5. 为了优化这一点,我将引用托托的答案。

    ^(19|20)\d\d-(0[1-9]|1[012])-([012]\d|3[01])T([01]\d|2[0-3]):([0-5]\d):([0-5]\d)$
    

    这是修复之前的第二个解决方案:

    ^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|12[0-9]|3[01][T](0[0-9]|1[0-9]|2[0123])[:](0[0-9]|12345[0-9])[:](0[0-9]|12345[0-9]))$
    

    enter image description here

    这是修复后的第二个解决方案:

    ^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[1]2[0-9]|3[01])[T](0[0-9]|1[0-9]|2[0123])[:](0[0-9]|12345[0-9])[:](0[0-9]|[12345][0-9])$
    

    enter image description here