我正在尝试在PHP的正则表达式中匹配特定的日期时间格式:
dd-mm-YYYY HH:ii:ss
应始终采用该格式。这意味着,例如,当它是该月的第一天时,必须有一个前导零。 E.g:
01-01-2013 01:01:01
我尝试了以下模式:
^[0-12]{2}-[0-31]{2}-[0-9]{4} [0-23]{2}:[0-59]{2}:[0-59]{2}$
但上述模式在时间戳上失败,例如:09-05-2013 19:45:10
。
http://rubular.com/r/eGBAhwiNCR
我知道这可能不是验证这样的日期时间的正确方法,但我真的想知道上面的错误。
答案 0 :(得分:7)
[0-12]{2}
与0
之前的数字12
不匹配。相反,它是一个允许0
到1
的字符类以及数字2
。随后的量词只允许重复那些,重复两次,重复0,1或2。
您的其他占位符遵循相同的无效方案。
如果你不能谷歌更好的正则表达式,最好诉诸\d{2}
或\d{4}
。更好的是,只需使用DateTime
来验证格式。
答案 1 :(得分:1)
问题是当您检查“范围”时,例如开始时为[0-12]
。这是一个字符类,它告诉正则表达式匹配0到1,然后是2.所以如果你在第一个之后添加更多的数字,它就不会像你期望的那样工作。稍微更改正则表达式(专注于[0-12]
首字母)[0-319]{2}-[0-12]{2}-[0-9]{4} [0-23]{2}:[0-59]{2}:[0-59]{2}$
,将与09-01-2011 11:11:10
匹配。
确保每个空间都有有效数字需要在框外思考。正则表达式:
(0[1-9]|[12][\d]|3[0-2])-(0[1-9]|1[0-2])-[\d]{4} (0[1-9]|1[\d]|2[0-3]):(0[1-9]|[1-5][\d]):(0[1-9]|[1-5][\d])$
将适用于您对regex you attempted所期望的内容。
如果你把它分解成更小的部分就有意义了(开头看起来真的很可怕)。看第一件(“天”0-31)。
(0[1-9]|[12][\d]|3[0-2])
这是使用或处理3种不同的情况。
0[1-9]
- 零后跟1-9之间的任何数字。我们不希望[0-9]{2}
,因为这会允许00
之类的数字。因此,如果数字以0
开头并且后面有任何其他数字(单位数天),则该数字有效。[12][\d]
- 1 or 2
后跟任意数字。这允许数字10-29
有效。3[0-2]
- 3
后跟任意0
到2
匹配30
,31
和32
。< / LI>
醇>
分解,这不是太糟糕但是这个模式随后会在你日期的每个“字段”中执行。因此,此正则表达式验证每个字段是否有效......但可能需要更好的方法来确认有效日期。 如果你可以30-02
例如,2月没有30天,那么检查是否复杂。
答案 2 :(得分:0)
^[0-9]{2}-[0-9]{2}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}$
答案 3 :(得分:0)
验证的例子是在php中,但正则表达式是标准的
enable_if