近期在搞文件系统的接口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}) //时间的判定条件