正则表达式匹配日期,支持闰年,格式为YYYYMMDD

年份:[d]{4}

带31的月份:(0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01]))
非2月不带31日的月份:((0[469])|11)((0[1-9])|([12][1-9])|30)
平年2月份 : 02((0[1-9])|(1[0-9])|(2[1-8]))
闰年2月份:02((0[1-9])|(1[0-9])|(2[1-9]))

闰年月份:
((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][1-9])|30))|(02((0[1-9])|(1[0-9])|(2[1-9])))

平年月份:
((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][1-9])|30))|(02((0[1-9])|(1[0-9])|(2[1-8])))

平年年份和月份,这个月份2月只有28号,如果出现0229这种日期就交给闰年带月份的正则表达式进行匹配,2个表达式用或连接

[d]{4}(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][1-9])|30))|(02((0[1-9])|(1[0-9])|(2[1-8]))))


闰年年份:
第一种:能被100整除,也能被400整除 0400 0800 1200 1600 2000 2400 2800 3200 3600 4000 4400 4800 5200 5600 6000 6400 6800 7200 7600 8000 8400 8800 9200 9600
(([02468][048])|([13579][26]))00

第二种 :不能被100整除,但能被4整除 04 08 12
[0-9]{2}(([02468][048])|([13579][26]))


闰年年份和月份:
(((([02468][048])|([13579][26]))00)|([0-9]{2}(([02468][048])|([13579][26]))))(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][1-9])|30))|(02((0[1-9])|(1[0-9])|(2[1-9]))))


总表达式:
([d]{4}(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][1-9])|30))|(02((0[1-9])|(1[0-9])|(2[1-8])))))|((((([02468][048])|([13579][26]))00)|([0-9]{2}(([02468][048])|([13579][26]))))(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][1-9])|30))|(02((0[1-9])|(1[0-9])|(2[1-9])))))

     一定要注意正则表达式连接起来的时候每个正则表达式都要在外层加个括号,这样就能保证连接起来的时候优先级不会改变,虽然这个整个表达式一眼看省去很难看,但是还是能达到验证的目的的,时间有限,就没去优化了,我估计还是有优化的空间的,我做这个,只是为了判断一个文件的文件名的名称是否合法,这个文件的名字中就带有日期,所以。。。。

原文:https://blog.csdn.net/lu188887/article/details/7421857

作者:ldy

出处:https://www.cnblogs.com/ParanoiaApe/

你所做的一切努力并不会立即给你想要的一切,但可以让你逐渐成为你想成为的那一种人!

本文版权归作者所有,欢迎转载,但请保留该声明。

原文地址:https://www.cnblogs.com/ParanoiaApe/p/10196509.html