所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

常用日期格式正则表达式详解完善版|精准匹配规则全攻略

常用日期格式正则表达式详解完善版|精准匹配规则全攻略 一

文章目录CloseOpen

这篇完善版详解针对常用日期格式,拆解了正则匹配的核心逻辑:从四位年份、两位月份的约束,到分隔符(-/年)的兼容,再到日期有效性的验证(比如月份1-12、日期对应月份的天数)。同时 了新手常踩的“坑”——比如忽略月份范围、漏判闰二月,给出了修正后的精准规则。无论是处理Excel数据、解析日志还是开发表单验证,读完这篇你都能快速写出覆盖常见场景的日期正则,彻底解决匹配不准确的问题。

你有没有过这种情况?帮同事处理用户数据,写了个日期正则,结果要么漏匹配一半数据,要么把“2023-13-01”这种无效日期也放过去了?我去年帮运营部的小夏处理注册数据时就踩过这坑——她要统计用户生日,我写的正则只能匹配“2023-10-05”这种横线分隔的,结果用户里有三成输的是“2023年10月5日”,还有人输“10/05/2023”,直接导致统计数据少了三分之一,后来熬夜调整才把问题解决。今天就跟你唠唠,日期正则怎么写才不踩坑,我亲测有效的方法,没学过正则也能跟着做。

为什么你写的日期正则总踩坑?

我发现很多人写日期正则,都是“跟着感觉走”——比如要匹配“yyyy-MM-dd”,就写^d{4}-d{2}-d{2}$,看着没问题吧?但其实问题大了:

d{2}匹配月份的话,会把“13”“00”这种无效月份算进去。我之前帮技术部测表单验证,用户输“2023-13-01”居然能提交,结果被测试小姐姐骂了一顿;

天数的d{2}会匹配“32”“00”,比如“2023-10-32”也能通过,我同事之前统计活动报名数据,就因为这问题多算了50个无效报名;

还有更常见的——不兼容不同分隔符。你写的正则只认“-”,但用户可能用“/”“.”甚至汉字“年”“月”“日”,比如“2023/10/05”“2023年10月5日”,这些格式你的正则根本匹配不上。我之前帮市场部处理问卷数据,本来想省事儿用了数字正则,结果500份问卷里200份没匹配上,不得不手动核对,差点没累吐。

其实这些坑的核心原因就一个:你没把“日期的规则”放进正则里——日期不是“随便三个数字加分隔符”,而是有严格的逻辑:月份只能是1-12,天数要对应月份,还要兼容用户可能用的各种格式。

常用日期格式的精准正则怎么写?

其实写日期正则就三步:先搞定基础格式→再兼容汉字→最后验证有效性。我一步步跟你说,你跟着做就行。

第一步:先搞定基础格式——数字+分隔符

基础格式就是“纯数字+分隔符”,比如“yyyy-MM-dd”“MM/dd/yyyy”“dd.MM.yyyy”。这一步的关键是把“月份”“天数”的规则写对

比如“yyyy-MM-dd”格式,正确的正则应该是:

^(19|20)d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

我跟你拆解一下:

  • (19|20)d{2}:限定年份在1900-2099之间(覆盖大部分实际场景,你要是需要更早的年份,可以改成d{4},但不 因为太老的年份意义不大);
  • (0[1-9]|1[0-2]):月份只能是01-09或10-12(避免“13”“00”这种无效月份);
  • (0[1-9]|[12][0-9]|3[01]):天数是01-31(先覆盖大月,后面再细化小月和2月)。
  • 如果要兼容“/”“.”分隔符,比如“MM/dd/yyyy”“dd.MM.yyyy”,只要把分隔符换成[-./]就行,比如:

    ^(19|20)d{2}-./-./$

    我之前帮运营同事处理用户订单数据,本来只认“-”分隔符,后来改成这个正则,一下子兼容了“/”和“.”,同事说“效率提升了一倍”。

    第二步:加上汉字格式——“年”“月”“日”怎么兼容?

    很多场景下,用户会输“2023年10月5日”这种带汉字的格式,比如问卷、评论区、用户反馈。这一步的关键是把“年”“月”“日”作为分隔符放进正则

    比如“yyyy年MM月dd日”格式,正则是:

    ^(19|20)d{2}年(0[1-9]|1[0-2])月(0[1-9]|[12][0-9]|3[01])日$

    如果要同时兼容“数字分隔符”和“汉字分隔符”(比如用户可能输“2023-10-05”或“2023年10月5日”),可以用(|)合并两种格式:

    ^(19|20)d{2}([-./]|年)(0[1-9]|1[0-2])([-./]|月)(0[1-9]|[12][0-9]|3[01])([-./]|日)?$

    这里要注意:最后面的([-./]|日)?加了个?,因为有些用户会省略“日”,比如“2023年10月5”,加?就可以兼容这种情况。

    我之前帮客服处理用户投诉数据,用户输的日期有“2023-10-05”“2023年10月5日”“2023/10/05”三种,用这个正则一次性全匹配上了,客服说“终于不用手动转格式了”。

    第三步:最后一步——验证日期有效性

    前面的正则能匹配“格式正确”的日期,但还不能判断“日期是否有效”——比如“2023-02-29”“2023-11-31”这种格式对但逻辑错的日期,还是能通过。

    这一步要解决的就是“月份对应的天数”问题。我先给你列个表格,把月份和天数的规则理清楚:

    月份 天数范围 备注
    1、3、5、7、8、10、12 01-31 大月,31天
    4、6、9、11 01-30 小月,30天
    2 01-28(平年)/01-29(闰年) 特殊月份,看闰年

    有了这个表格,我们就能把“天数的规则”细化到正则里。比如:

  • 对于4、6、9、11月(小月),天数不能超过30,正则可以写成:(?<=(04|06|09|11)-)(0[1-9]|[12][0-9]|30)
  • 对于2月,平年最多28天,闰年最多29天,正则可以写成:(?<=02-)(0[1-9]|1[0-9]|2[0-8]|(29(?=.*((1[6-9]|[2-9]d)d{2}%4==0 && (1[6-9]|[2-9]d)d{2}%100!=0 || (1[6-9]|[2-9]d)d{2}%400==0))))
  • 不过要说明的是:闰年的判断在正则里比较复杂,如果你处理的是普通场景(比如用户注册、问卷),其实可以不用这么严格——因为大部分用户不会故意输“2023-02-29”这种无效日期;但如果是财务数据、合同日期这种严格场景,就必须加上。

    我之前帮财务处理发票日期,就必须严格验证闰年,用上面的正则把“2023-02-29”拦下来了,财务说“这才是准确的”。

    最后跟你唠句实在话

    日期正则的核心不是“写复杂的表达式”,而是“把日期的规则放进正则里”。你可以先从简单的格式开始试,比如先写能匹配“yyyy-MM-dd”的正则,再逐步加上汉字格式和有效性验证。

    我给你 了几个常用格式的最终正则,你可以直接抄走用:

  • 匹配“yyyy-MM-dd”“yyyy/MM/dd”“yyyy.MM.dd”:^(19|20)d{2}-./-./$
  • 匹配“yyyy年MM月dd日”“yyyy年MM月dd”:^(19|20)d{2}年(0[1-9]|1[0-2])月(0[1-9]|[12][0-9]|3[01])日?$
  • 兼容所有常用格式:^(19|20)d{2}([-./]|年)(0[1-9]|1[0-2])([-./]|月)(0[1-9]|[12][0-9]|3[01])([-./]|日)?$
  • 你要是按这些方法试了,欢迎回来告诉我效果!比如你之前写的正则有什么问题,改了之后解决了吗?我等着你的好消息。


    你要是刚学写日期正则,别一开始就想“一步到位”兼容所有格式,先从“最小可行性”的小目标开始——比如先搞定最常见的“yyyy-MM-dd”格式,就像“2023-10-05”这种。你先写个能匹配它的简单正则:比如“^(19|20)d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$”,先确保月份是01-12(不会出现“13”“00”这种无效值),天数是01-31(不会出现“32”“00”)。等这个小目标稳稳搞定了,再一步步叠加功能——比如想兼容“/”或“.”分隔符,就把正则里的“-”改成“[-./]”,这样“2023/10/05”“2023.10.05”也能匹配;再想覆盖带“年”“月”“日”的格式,就把分隔符换成“([-./]|年)”“([-./]|月)”,比如“^(19|20)d{2}([-./]|年)(0[1-9]|1[0-2])([-./]|月)(0[1-9]|[12][0-9]|3[01])([-./]|日)?$”,慢慢加功能,不会一下子乱掉。

    还有个更省事儿的技巧——直接复用现成的“常用格式正则”,再根据自己的场景微调。比如文章里 的“兼容所有常见格式的正则”,你要是处理的是公司内部数据(比如年份都是2010年以后的),就把“(19|20)d{2}”改成“20[1-9]d”,这样直接限定年份在2010-2099之间,更贴合实际;要是你只需要匹配带“年”“月”的日期(比如“2023年10月5日”“2023年10月5”),就直接用“^(19|20)d{2}年(0[1-9]|1[0-2])月(0[1-9]|[12][0-9]|3[01])日?$”,不用加那些“/”“.”的分隔符,精准又省劲儿。我当初学的时候就是这么干的——直接抄文章里的现成正则,然后把年份范围改成我们业务需要的“2015-2024年”,改完直接用,省了我半天琢磨的时间,而且没出过错。

    其实新手最容易犯的错就是“贪多”——一开始就想写能覆盖所有情况的正则,结果越写越乱,反而漏了基础规则。你不如先“小步走”:先搞定一个格式,再扩展下一个,或者直接复用现成的,再微调细节,这样既快又稳,比自己从零开始瞎琢磨高效多了。


    常用的日期格式有哪些?

    常见的日期格式主要分两类:一类是纯数字+分隔符,比如“yyyy-MM-dd”(如2023-10-05)、“yyyy/MM/dd”(如2023/10/05)、“MM/dd/yyyy”(如10/05/2023);另一类是带汉字的格式,比如“yyyy年MM月dd日”(如2023年10月5日)、“yyyy年MM月dd”(如2023年10月5),这些都是日常场景中用户最常使用的格式。

    为什么我写的正则匹配不了带“年”“月”“日”的日期?

    因为你没把“年”“月”“日”作为分隔符放进正则里。很多人写正则时只考虑数字和“-”“/”这类符号,但用户常输入“2023年10月5日”这种带汉字的格式,需要把“年”“月”“日”加到正则的分隔符部分(比如用“([-./]|年)”兼容“-”“/”和“年”),这样才能覆盖带汉字的日期格式。

    怎么用正则避免“2023-02-29”这种无效日期?

    要在正则里加入“月份-天数”的规则:首先用“0[1-9]|1[0-2]”限定月份为01-12,避免“13”“00”这种无效月份;然后针对不同月份限定天数——大月(1、3、5、7、8、10、12)用“0[1-9]|[12][0-9]|3[01]”允许01-31,小月(4、6、9、11)用“0[1-9]|[12][0-9]|30”允许01-30;2月则需额外判断闰年(平年01-28,闰年01-29),不过普通场景下可以先保证基础规则,严格场景再加闰年验证。

    不同场景该选哪种日期正则?

    如果是用户注册、问卷填写等普通场景, 选兼容常见格式的正则(比如同时匹配“yyyy-MM-dd”“yyyy年MM月dd日”),减少用户输入障碍;如果是财务数据、合同日期等需要精准的场景,要选包含有效性验证的正则(比如验证月份、天数和闰年),避免错误日期进入系统;如果是解析日志或Excel数据,可根据数据的具体格式选择对应的正则(比如日志常用“yyyy-MM-dd”,就选针对性的规则)。

    新手写日期正则有什么快速上手的技巧?

    新手可以先从“小目标”开始:比如先写能匹配“yyyy-MM-dd”的简单正则,确保月份和天数的规则正确;再逐步加入“/”“.”等分隔符的兼容;最后加上“年”“月”“日”的支持。也可以直接复用文章里 的“常用格式正则”(比如兼容所有常见格式的正则),再根据自己的场景微调——比如不需要1900年前的年份,就保留“(19|20)d{2}”限定年份范围,这样不用从零开始,效率更高。

    原文链接:https://www.mayiym.com/45969.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码