使用正则表达式判断年月日是否合法(这里不考虑闰年2月29日的情况)
判断类型为 20151206、19551230、20180808类似这种格式的合法性
其实并不很难,主要思考过程,(答案见末尾):
先确定句子结构:(年月日)
年由4位组成,月和日分别由2位组成
1、年:
可以分为19开头和20开头,(19开头|20开头)
19是固定的,后面两位数字都是0-9
20是固定的,后面两位数字从00-19(今年是19年),即[01][0-9],由此得到判断年的合法性的表达式:
(19[0-9]{2}|20[01][0-9])
2、月(不考虑2月29号闰年的情况):
月分为小月大月2月:结构可以是(小月|大月|2月)
小月由04、06、09、11:(0[469]|11)
小月有30天:([012][0-9|30])
组合起来为:(0[469]|11)(012[0-9|30])
大月直接按照小月改几个数字即可:(0[13578]|1[02])(012[0-9|3[01]]) 【这里[012][0-9]会匹配到00,需要优化,其实多写一个类似枚举的值即可,相当于穷举了】
2月为:(02([01][0-9]|2[0-8]))
最后把小月、大月、2月三部分填入句子结构,组合起来,然后把年也加进来,就得到下面一串很长的正则表达式:
(19[0-9]{2}|20([01][0-9]))((0[469]|11)([012][0-9]|30)|(0[13578]|1[02])([012][0-9]|3[01])|(02([01][0-9]|2[0-8])))