• 完整日期正则表达式


    正则表达式 日期匹配 闰年平年


    需要对日期进行一个正则表达式匹配,想要找出一个能够匹配所有情况的正则表达式。
    网上这篇博客【http://www.cnblogs.com/jay-xu33/archive/2009/01/08/1371953.html】说得挺不错的,大家可以借鉴参考。

    1.年份分析

    1.1 年份的相关概念

    年份主要是有平年和闰年之别,平年有365天,闰年有366天。

    为什么平年有365天和闰年有366天,而不是其他数字?

    (1)首先,地球绕太阳公转一周的时间长度称为【一回归年】。一回归年换算成时间长度就是365天5时48分46秒,即365.02422天。为了方便,就取整数365天作为平年的天数。这里就说明了数字【365】的来源。
    
    (2)平年一年有365日,比一回归年短0.2422日,四年共短0.9688日(约等于1),所以每4年增加1日,这一年有366日,就是闰年这里就解释了数字【366】的来源。
    
    (3)闰年定义:上面说到每4年增加1日,这年有366天就是闰年。但每4年增加1日,这样年份天数比4个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年(如果按照原来每4年就有一个闰年的计算方式,则400年就有100个闰年),这样公历年的平均长度与回归年就相近似了。由此规定:年份是整百数的必须是400的倍数才是闰年,例如1300年不是闰年,1200年是闰年。
    
    

    由此可知,4个年份数字(yyyy)满足【能被400整除】或【被4整除且不能被100整除】两个条件之一的,那一年就是闰年。其他年份就是平年。

    1.2 年份的数字表示

    常见的合法日期时间在一个有效范围内,这里我们取【0001年01月01日 00时00分00秒】到【9999年12月31日 23时59分59秒】。

    (1)所有年份是从0001到9999,要注意不能出现四个数字同时为0的情况,即不能出现0000年,这是非法的年份数字。一个数字可以用d或[0-9]表示。

    所有年份正则表达式:
    [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} 
    

    (2)闰年
    根据闰年的定义将闰年分为两类:

    • 能被4整除但不能被100整除的年份。
      根据年份最后两位数字的变化规律,得到下面的正则匹配式子:
    ([0-9]{2})(0[48]|[2468][048]|[13579][26])
    
    • 能被400整除的年份。
      能被400整除的数最后两位肯定是00,我们只要保证前两位能被4整除即可,相应的正则表达式为:
    (0[48]|[2468][048]|[13579][26])00
    

    2.日期分析

    日期主要就是每个月的天数不同,比较特殊的就是2月,平年2月28天,闰年2月有29天。其他月份在平年和闰年没有区别。

    (1)月份为 1, 3, 5, 7, 8, 10, 12,天数范围为 01 - 31,正则表达式为:

    (0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])
    

    (2)月份为 4, 6, 9, 11,天数范围为 01-30,正则表达式为:

    (0[469]|11)-(0[1-9]|[12][0-9]|30)
    

    (3)月份为 2,平年时的正则表达式为:

    02-(0[1-9]|[1][0-9]|2[0-8])
    

    闰年时只要特地匹配29日那天即可,因为其他的日子都可以在平年的表达式里面匹配到,故为:

    02-29
    

    3.完整的年月日正则表达式

    ^((([0-9]{2})(0[48]|[2468][048]|[13579][26]))   #闰年,能被4整除但不能被100整除
    |((0[48]|[2468][048]|[13579][26])00)   #闰年,能被400整除
    -02-29)  #匹配闰年2月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}) #平年(0001-9999)
    -(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))   #月日,1、3、5、7、8、10、12月有31天
    |((0[469]|11)-(0[1-9]|[12][0-9]|30))   #月日,4、6、9、11月有30天
    |(02-(0[1-9]|[1][0-9]|2[0-8])))   #平年2月只有28天,月日表示为【02-01至02-28】
    

    PS:如果还有加上时间的验证,那么就在上面日期的基础上加上【HH:mm:ss】的考虑。小时分为【00-12】或【00-23】两种情况,时间和分钟都是【00-59】。

    参考文章:
    http://www.cnblogs.com/jay-xu33/archive/2009/01/08/1371953.html
    http://www.jb51.net/article/20753.htm
    http://www.cnblogs.com/bit-by-bit/p/6703355.html
    http://www.cnblogs.com/wyxy_czj/articles/1958221.html

  • 相关阅读:
    fenby C语言P21
    fenby C语言 P20
    fenby C语言 P19
    fenby C语言 P18
    fenby C语言 P17
    fenby C语言 P16
    fenby C语言 P15
    fenby C语言 P14
    Python学习之路:subprocess模块和面向对象
    Python学习之路:XML模块
  • 原文地址:https://www.cnblogs.com/fefjay/p/6889193.html
Copyright © 2020-2023  润新知