年月日时分秒的正则表达式
近期在搞文件系统的接口bug修复,用于处理用户可能输入各种乱七八糟的时间。为了又搞了一下正则表达式。这里给出了1900-2099年之间的合理时间正则表达式,适用于C++程序。
表达式分解如下,用的时候只需要把注释去掉,把所有内容拼到一行即可,匹配的格式为YYYY/MM/DD hh:mm:ss,年份必须在1900-2099之间(包含)。
(
(
((19)|(20)\d{2}) //1900-2099之间的年份
/
(
(
(0[13578]|1[02])/(0[1-9]|[12][0-9]|3[01]) //大月份及其可以包含的日期
)
|
((0[469]|11)/(0[1-9]|[12][0-9]|30)) //小月份及其可以包含的日期
|
(02/(0[1-9]|[1][0-9]|2[0-8])) //所有2月份可以包含的日期
)
)
| //闰年的2月判定条件
( //闰年的判定条件
(
((19)|(20)\d{2})(0[48]|[2468][048]|[13579][26]) //非整百的年份,19或20开头后两位为:(1)04或08;(2)20、24、28、40、44等;(3)12、16、32、36等
|
(2000) //整百的年份,只有2000年是闰年
)
/02/29
)
)
\s(0\d{1}|1\d{1}|2[0-3]):[0-5]\d{1}:([0-5]\d{1}) //时间的判定条件
如果想要非0000-9999之间的正则表达式,则如下:
(
(
(\d{4}) //0000-9999之间的年份
/
(
(
(0[13578]|1[02])/(0[1-9]|[12][0-9]|3[01]) //大月份及其可以包含的日期
)
|
((0[469]|11)/(0[1-9]|[12][0-9]|30)) //小月份及其可以包含的日期
|
(02/(0[1-9]|[1][0-9]|2[0-8])) //所有2月份可以包含的日期
)
)
| //闰年的2月判定条件
( //闰年的判定条件
(
([0-9]{2})(0[48]|[2468][048]|[13579][26]) //非整百的年份
|
((0[48]|[2468][048]|[3579][26])00) //整百的年份
)
/02/29
)
)
\s(0\d{1}|1\d{1}|2[0-3]):[0-5]\d{1}:([0-5]\d{1}) //时间的判定条件
