日期格式正则表达式(完善版)

野性酷女 2023-07-08 09:10 58阅读 0赞

第一步,验证年份

年份范围为 0001 - 9999,匹配YYYY的正则表达式为:

  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}

第二步,验证月份和日期

1. 月份为[1, 3, 5, 7, 8, 10, 12],天数范围为01-31

匹配MM__sep__DD的正则表达式为:

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

2. 月份为[4, 6, 9, 11],天数范围为01-30

匹配MM__sep__DD的正则表达式为:

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

3. 月份为2月

3.1 平年,2月为01-28

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

3.2 闰年,2月为01-29

由于上面已经把2月01-28都包含了,所以这里只需要把2月29号匹配出来即可

1. 能被4整除,但不能被100整除

前两位不需要考虑,后两位能被4整除只有以下3种情况:
①十位为0,个位为[4,8]
②十位为[2,4,6,8],个位为[0,4,8]
③十位为[1,3,5,7,9],个位为[2,6]
则年份正则表达式为:

  1. ([0-9]{2})(0[48]|[2468][048]|[13579][26])

YYYY__sep__MM__sep__DD:

  1. ([0-9]{2})(0[48]|[2468][048]|[13579][26])__sep__02__sep__29

2. 能被400整除

首先,能被400整除,后两位一定是00,则只需要保证前两位能被4整除。
前两位能被4整除只有以下3种情况:
①千位为0,百位为[4,8]
②千位为[2,4,6,8],百位为[0,4,8]
③千位为[1,3,5,7,9],百位为[2,6]
则年份正则表达式为:

  1. (0[48]|[2468][048]|[13579][26])00

YYYY__sep__MM__sep__DD:

  1. (0[48]|[2468][048]|[13579][26])00__sep__02__sep__29

结论:

  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})
  2. __sep__
  3. (
  4. ((0[13578]|1[02])__sep__(0[1-9]|[12][0-9]|3[01]))
  5. |
  6. ((0[469]|11)__sep__(0[1-9]|[12][0-9]|30))
  7. |
  8. (02__sep__(0[1-9]|[1][0-9]|2[0-8]))
  9. )

直接使用,方便复制替换

  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})__sep__(((0[13578]|1[02])__sep__(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)__sep__(0[1-9]|[12][0-9]|30))|(02__sep__(0[1-9]|[1][0-9]|2[0-8])))

image.png

  1. 闰年

增加缩进,方便理解

  1. (([0-9]{2})(0[48]|[2468][048]|[13579][26])__sep__02__sep__29)
  2. |
  3. ((0[48]|[2468][048]|[13579][26])00__sep__02__sep__29)

直接使用,方便复制替换

  1. (([0-9]{2})(0[48]|[2468][048]|[13579][26])__sep__02__sep__29)|((0[48]|[2468][048]|[13579][26])00__sep__02__sep__29)

image.png

  1. 平年和闰年合并

根据上述1和2,可以得出一个匹配合法日期的正则表达式(不区分平年和闰年)
增加缩进,方便理解

  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})
  2. __sep__
  3. (
  4. ((0[13578]|1[02])__sep__(0[1-9]|[12][0-9]|3[01]))
  5. |
  6. ((0[469]|11)__sep__(0[1-9]|[12][0-9]|30))
  7. |
  8. (02__sep__(0[1-9]|[1][0-9]|2[0-8]))
  9. ))
  10. |
  11. ((([0-9]{2})(0[48]|[2468][048]|[13579][26])__sep__02__sep__29)
  12. |
  13. ((0[48]|[2468][048]|[13579][26])00__sep__02__sep__29))

直接使用,方便复制替换

  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})__sep__(((0[13578]|1[02])__sep__(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)__sep__(0[1-9]|[12][0-9]|30))|(02__sep__(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])__sep__02__sep__29)|((0[48]|[2468][048]|[13579][26])00__sep__02__sep__29))

image.png

发表评论

表情:
评论列表 (有 0 条评论,58人围观)

还没有评论,来说两句吧...

相关阅读