每个月最后一天的正则表达式(区分平年闰年)


--yyyy-MM-dd所有日期格式正则表达式验证
1、月份为1, 3, 5, 7, 8, 10, 12,天数范围为 01 - 31,匹配MM-DD的正则表达式为:(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])
 2、月份为4, 6, 9, 11,天数范围为 01-30,匹配MM-DD的正则表达式为:
(0[469]|11)-(0[1-9]|[12][0-9]|30
 3、月份为2,考虑平年情况,匹配MM-DD的正则表达式为:02-(0[1-9]|[1][0-9]|2[0-8]根据上面的成果,
我们可以得到匹配平年日期格式为YYYY-MM-DD的正则表达式:
([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((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])))

4、
4.1、能被4整除但不能被100整除的年份。寻找后两位的变化规律,可以很快得到下面的正则匹配
([0-9]{2})(0[48]|[2468][048]|[13579][26])
4.2、能被400整除的年份。能被400整除的数肯定能被100整除,因此后两位肯定是00,我们只要保证前两位能被4整除即可,
相应的正则表达式为:(0[48]|[2468][048]|[3579][26])00闰年的2月份有29天,
因此匹配闰年日期格式为YYYY-MM-DD的正则表达式为(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29
最后,将平年和闰年的日期验证表达式合并,我们得到最终的验证日期格式为YYYY-MM-DD的正则表达式为:
(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((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]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)
DD/MM/YYYY格式的正则验证表达式为:(((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}))|(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))

闰年的考虑。根据闰年的定义,我们可以将闰年分为两类
我们先花点时间列举出1900-2099之间,那些年份是闰年吧
1904,1908,1912,1916,1920,1924,1928,1932,1936,1940,
1944,1948,1952,1956,1960,1964,1968,1972,1976,1980,
1984,1988,1992,1996,2000,2004,2008,2012,2016,2020,
2024,2028,2032,2036,2040,2044,2048,2052,2056,2060,
2064,2068,2072,2076,2080,2084,2088,2092,2096

认真分析以上闰年之后,很容易发现:
1. 个位数必是偶数
2. 十位数为奇数时,个位数只有两种可能:2和6
3. 十位数为偶数(除0外)时,个位数有三种可能:0、4、8
4. 十位数为0时,个位数为4和8,2000年特殊处理
所以,匹配闰年年份如下:(((19|20)([13579][26]|[2468][048]|0[48]))|(2000))
所以,闰年2月分的匹配模式为(((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-(0?[1-9]|[12]\d)


根据上面改造的

===========================================================================
--每个月最后一天的正则表达式
1.月份为1, 3, 5, 7, 8, 10, 12的最后一天(MM-dd):(0[13578]|1[02])-(3[1])

2、月份为4, 6, 9, 11月的最后一天(MM-dd):(0[469]|11)-(3[0])

3、月份为2,考虑平年情况,匹配MM-DD的正则表达式为:(02-(2[8]))
根据上面的成果,我们可以得到匹配平年月末日期格式为YYYY-MM-DD的正则表达式
([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(3[1]))|(0[469]|11)-(3[0])|(02-(2[8])))

4、闰年2月份最后一天正则表达式:((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)


综上,最终的正则表达式为:
^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(3[1]))|(0[469]|11)-(3[0])|(02-(2[8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$




--数据日期(dis)包括1月1号和每个月月末
^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(3[1]))|((0[1])-(0[1]))|(0[469]|11)-(3[0])|(02-(2[8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$





  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值