判断日期的正则表达式

^(?:\d{4}(?:-|\/|年))?\d{1,2}(?:-|\/|月)\d{1,2}日?$

可以匹配以下的日期格式:

2019-01-02
2019-1-02
2019-01-2
2019-1-2
01-02
1-02
01-2
1-2
2019/01/02
2019/1/02
2019/01/2
2019/1/2
01/02
1/02
01/2
1/2
2019年01月02日
2019年1月02日
2019年01月2日
2019年1月2日
01月02日
1月02日
01月2日
1月2日

只验证格式,不验证日期的正确性

1 概述 首先需要说明一点,无论是Winform,还是Webform,都有很成熟日历控件,无论从易用性还是可扩展性上看,日期选择和校验还是用日历控件来实现比较好。 前几天在CSDN多个版块看到需要日期正则帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误地方,还请大家指正。 日期正则一般是对格式有要求,且数据不是直接由用户输入时使用。因应用场景不同,写出正则也不同,复杂程度也自然不同。正则书写需要根据具体情况具体分析,一个基本原则就是:只写合适,不写复杂。 对于日期提取,只要能与非日期区分开,写最简单正则即可,如 \d{4}-\d{2}-\d{2} 如果可以在源字符串中唯一定位yyyy-MM-dd格式日期,则可用做提取。 对于验证,如果仅仅是验证字符组成及格式是没有多大意义,还要加入对规则校验。由于闰年存在,使得日期校验正则变得比较复杂。 先来考察一下日期有效范围以及什么是闰年。 2 日期规则 2.1 日期有效范围 对于日期有效范围,不同应用场景会有所不同。 MSDN中定义DateTime对象有效范围是:0001-01-01 00:00:00到9999-12-31 23:59:59。 UNIX时间戳0按照ISO 8601规范为 :1970-01-01T00:00:00Z。 而实际应用中,日期范围基本上不会超出DateTime所规定范围,所以正则验证取其中常用日期范围即可。 2.2 什么是闰年 (以下摘自百度百科) 闰年(leap year)是为了弥补因人为历法规定造成年度天数与地球实际公转周期时间差而设立。补上时间差年份为闰年。 地球绕日运行周期为365天5小时48分46秒(合365.24219天),即一回归年(tropical year)。公历平年只有365日,比回归年短约0.2422 日,每四年累积约一天,把这一天加于2月末(即2月29日),使当年时间长度变为366日,这一年就为闰年。 需要注意是,现在公历是根据罗马人“儒略历”改编而得。由于当时没有了解到每年要多算出0.0078天问题,从公元前46年,到16世纪,一共累计多出了10天。为此,当时教皇格雷果里十三世,将1582年10月5日人为规定为10月15日。并开始了新闰年规定。即规定公历年份是整百数,必须是400倍数才是闰年,不是400倍数就是平年。比如,1700年、1800年和1900年为平年,2000年为闰年。此后,平均每年长度为365.2425天,约4年出现1天偏差。按照每四年一个闰年计算,平均每年就要多算出0.0078天,经过四百年就会多出大约3天来,因此,每四百年中要减少三个闰年。闰年计算,归结起来就是通常说:四年一闰;百年不闰,四百年再闰。 2.3 日期格式 根据不同语言文化,日期连字符会有所不同,通常有以下几种格式: yyyyMMdd yyyy-MM-dd yyyy/MM/dd yyyy.MM.dd 3 日期正则表达式构建 3.1 规则分析 写复杂正则一个常用方法,就是先把不相关需求拆分开,分别写出对应正则,然后组合,检查一下相互关联关系以及影响,基本上就可以得出对应正则。 按闰年定义可知,日期可以有几种分类方法。 3.1.1 根据天数是否与年份有关划分为两类 与年份无关一类中,根据每月天数不同,又可细分为两类  1、3、5、7、8、10、12月为1-31日  4、6、9、11月为1-30日 与年份有关一类中  平年2月为1-28日  闰年2月为1-29日 3.1.2 根据包含日期不同可划分为四类  所有年份所有月份都包含1-28日  所有年份除2月外都包含29和30日  所有年份1、3、5、7、8、10、12月都包含31日  闰年2月包含29日 3.1.3 分类方法选择 因为日期分类之后实现,是要通过(exp1|exp2|exp3)这种分支结构来实现,而分支结构是从左侧分支依次向右开始尝试匹配,当有一个分支匹配成功时,就不再向右尝试,否则尝试所有分支后并报告失败。 分支多少,每个分支复杂程度都会影响匹配效率,考虑到被验证日期概率分布,绝大多数都是落到1-28日内,所以采用第二种分类方法,会有效提高匹配效率。 3.2 正则实现 采用3.1.2节分类方法,就可以针对每一个规则写出对应正则,以下暂按MM-dd格式进行实现。 先考虑与年份无关前三条规则,年份可统一写作 (?!0000)[0-9]{4} 下面仅考虑月和日正则  包括平年在内所有年份月份都包含1-28日 (0[1-9]|1[0-2])-(0
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页