首先需要介绍说明
![](/icons/80289de.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
前几天在CSDN多个版块看到需要日期正则
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289cuowu.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
日期正则
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
对于日期提取
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
复制代码 代码如下:
\d{4}-\d{2}-\d{2}
如果可以在源
![](/icons/80289zifu.gif)
![](/icons/80289yi.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
对于验证
![](/icons/80289dou.gif)
![](/icons/80289zifu.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
先来考察
![](/icons/80289yi.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
2 日期
![](/icons/80289de.gif)
2.1 日期
![](/icons/80289de.gif)
对于日期
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
MSDN中定义
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
UNIX时间戳
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
而实际应用中
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
2.2 什么是闰年
(以下摘自百度百科)
闰年(leap year)是为了弥补因人为历法规定造成
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
地球绕日运行周期为365天5小时48分46秒(合365.24219天)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou2.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou2.gif)
需要注意
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou2.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
![](/icons/80289dou2.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
2.3 日期
![](/icons/80289de.gif)
根据区别
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289zifu.gif)
![](/icons/80289dou.gif)
yyyyMMdd
yyyy-MM-dd
yyyy/MM/dd
yyyy.MM.dd
3 日期正则表达式构建 3.1 规则分析
写复杂正则
![](/icons/80289de.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
按闰年
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
3.1.1 根据天数是否和年份有关划分为两类
和年份无关
![](/icons/80289de.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
Ø 1、3、5、7、8、10、12月为1-31日
Ø 4、6、9、11月为1-30日
和年份有关
![](/icons/80289de.gif)
![](/icons/80289yi.gif)
Ø 平年2月为1-28日
Ø 闰年2月为1-29日
3.1.2 根据包含日期区别可划分为 4类
Ø 所有年份
![](/icons/80289de.gif)
Ø 所有年份除2月外都包含29和30日
Ø 所有年份1、3、5、7、8、10、12月都包含31日
Ø 闰年2月包含29日
3.1.3 分类思路方法选择
![](/icons/80289yinwei.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
分支
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
3.2 正则实现
采用3.1.2节
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
先考虑和年份无关
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
复制代码 代码如下:
(?!0000)[0-9]{4}
下面仅考虑月和日
![](/icons/80289de.gif)
Ø 包括平年在内
![](/icons/80289de.gif)
![](/icons/80289de.gif)
复制代码 代码如下:
(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])
Ø 包括平年在内
![](/icons/80289de.gif)
复制代码 代码如下:
(0[13-9]|1[0-2])-(29|30)
Ø 包括平年在内
![](/icons/80289de.gif)
复制代码 代码如下:
(0[13578]|1[02])-31)
合起来就是除闰年
![](/icons/80289de.gif)
![](/icons/80289de.gif)
复制代码 代码如下:
(?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)
接下来考虑闰年
![](/icons/80289de.gif)
Ø 闰年2月包含29日
这里
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
可通过以下代码输出所有
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
复制代码 代码如下:
for (
![](/icons/80289int.gif)
![](/icons/80289jiajia.gif)
{
![](/icons/80289if.gif)
![](/icons/80289dd.gif)
![](/icons/80289dd.gif)
{
richTextBox2.Text
![](/icons/80289jiadeng.gif)
![](/icons/80289string.gif)
}
}
根据闰年
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289yi.gif)
复制代码 代码如下:
([0-9]{2}(0[48]|[2468][048]|[13579][26])
百年不闰
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
复制代码 代码如下:
(0[48]|[2468][048]|[13579][26])00
合起来就是所有闰年
![](/icons/80289de.gif)
复制代码 代码如下:
([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)
4条规则都已实现
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289de.gif)
复制代码 代码如下:
^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$
考虑到这个正则表达式仅仅是用作验证
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
复制代码 代码如下:
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
以上正则年份0001-9999
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
![](/icons/80289de.gif)
复制代码 代码如下:
DateTime dt =
![](/icons/80289new.gif)
DateTime endDay =
![](/icons/80289new.gif)
Stopwatch sw =
![](/icons/80289new.gif)
![](/icons/80289kh.gif)
sw.Start
![](/icons/80289kh.gif)
Regex dateRegex =
![](/icons/80289new.gif)
//Regex dateRegex =
![](/icons/80289new.gif)
Console.WriteLine("开始日期: " + dt.
![](/icons/80289ToString.gif)
while (dt <= endDay)
{
![](/icons/80289if.gif)
![](/icons/80289ToString.gif)
{
Console.WriteLine(dt.
![](/icons/80289ToString.gif)
}
![](/icons/80289if.gif)
![](/icons/80289dd.gif)
{
![](/icons/80289break.gif)
}
dt = dt.AddDays(1);
}
Console.WriteLine("结束日期: " + dt.
![](/icons/80289ToString.gif)
sw.Stop
![](/icons/80289kh.gif)
Console.WriteLine("测试用时: " + sw.ElapsedMilliseconds + "ms");
Console.WriteLine("测试完成!");
Console.ReadLine
![](/icons/80289kh.gif)
4 日期正则表达式扩展
4.1 “年月日”形式扩展
以上实现
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289zifu.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
复制代码 代码如下:
^(?:(?!0000)[0-9]{4}([-/.]?)(?:(?:0?[1-9]|1[0-2])([-/.]?)(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])([-/.]?)(?:29|30)|(?:0?[13578]|1[02])([-/.]?)31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]?)0?2([-/.]?)29)$
使用反向引用进行简化
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289zifu.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou2.gif)
复制代码 代码如下:
^(?:(?!0000)[0-9]{4}([-/.]?)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]?)0?2\2(?:29))$
这就是“年月日”这种形式最全
![](/icons/80289de.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
4.2 其它形式扩展
了解了以上正则各部分代表
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
复制代码 代码如下:
^(?:(?:(?:0?[1-9]|1[0-9]|2[0-8])([-/.]?)(?:0?[1-9]|1[0-2])|(?:29|30)([-/.]?)(?:0?[13-9]|1[0-2])|31([-/.]?)(?:0?[13578]|1[02]))([-/.]?)(?!0000)[0-9]{4}|29([-/.]?)0?2([-/.]?)(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00))$
这种格式需要注意
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
![](/icons/80289zifu.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
4.3 添加时间
![](/icons/80289de.gif)
时间
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
复制代码 代码如下:
([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]
合入到日期
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
复制代码 代码如下:
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)\s+([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$
4.4 年份定制
以上所有涉及到平年
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou2.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
如年份1600-9999
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289zifu.gif)
![](/icons/80289yi.gif)
![](/icons/80289dou2.gif)
复制代码 代码如下:
^(?:(?:1[6-9]|[2-9][0-9])[0-9]{2}([-/.]?)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:(?:1[6-9]|[2-9][0-9])(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)([-/.]?)0?2\2(?:29))$
5特别介绍说明
以上正则采用
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
另外需求介绍说明
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
正则
![](/icons/80289de.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou.gif)
![](/icons/80289dou2.gif)
最新评论