修改正则表达式以支持字符串格式月份的日期验证
支持字符串月份的日期验证正则表达式
当然可以修改原正则来支持字符串格式的月份(如1-Dec-2018、uu-Jun-2020这类格式)。我会基于你的原有规则,添加字符串月份的匹配分支,同时保留所有原有的验证逻辑(包括uu未知值的情况)。
修改后的正则表达式
^(?: # 数字日期原有规则(保留) (?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)\d{2})| (?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))| (?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)\d{2})| # 数字日期的uu规则(保留) (uu\/(?:[1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])\/[0-9]{4})| (uu\/uu\/[0-9]{4})| (uu\/uu\/uuuu)| # 新增:字符串月份的日期规则 # 31天的字符串月份(Jan,Mar,May,Jul,Aug,Oct,Dec) (?:(?:31|uu)(\/|-|\.)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\5(?:(?:1[6-9]|[2-9]\d)\d{2}|uuuu))| # 30天的字符串月份(除Feb外的所有月份) (?:(?:29|30|uu)(\/|-|\.)(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\6(?:(?:1[6-9]|[2-9]\d)\d{2}|uuuu))| # 闰年2月29日(字符串月份Feb) (?:(?:29|uu)(\/|-|\.)Feb\7(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)|uuuu))| # 1-28日的字符串月份(所有月份) (?:(?:0?[1-9]|1\d|2[0-8]|uu)(\/|-|\.)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\8(?:(?:1[6-9]|[2-9]\d)\d{2}|uuuu))| # 字符串月份的uu组合(uu-uu-YYYY 或 uu-uu-uuuu) (uu(\/|-|\.)uu\9(?:[0-9]{4}|uuuu)) )$
注:如果需要忽略大小写匹配月份(比如
1-dec-2018也能通过验证),可以在正则开头添加(?i)修饰符,即^(?i)(?:...)。
关键修改说明
我新增了几个核心分支来支持字符串月份:
- 31天月份的匹配:针对有31天的月份(Jan/Mar/May/Jul/Aug/Oct/Dec),允许日期为
31或uu,年份为4位数字或uuuu,且分隔符保持一致(比如31-Dec-2018、uu/Mar/uuuu)。 - 30天月份的匹配:针对除February外的所有月份,允许日期为
29/30/uu,年份规则同上。 - 闰年2月的特殊处理:保留原有的闰年验证逻辑,同时支持
29-Feb-2020或uu.Feb.2000这类格式,也允许年份为uuuu。 - 1-28日的通用匹配:针对所有字符串月份,允许日期为
1-28或uu,年份规则同上。 - 全uu组合:支持
uu-uu-2018、uu/uu/uuuu这类完全包含未知值的格式。
测试用例示例
以下格式都能被新正则匹配:
- 标准字符串月份日期:
1-Dec-2018、30-Jun-2020、29-Feb-2024 - 带uu的字符串月份日期:
uu-Mar-2019、15-uu-2021、uu-Feb-uuuu - 原有支持的数字日期:
1/12/2018、uu/12/2018、uu/uu/uuuu
内容的提问来源于stack exchange,提问作者aggicd
相关产品推荐
相关产品推荐

