[转载]正则表达式-对日期的验证
http://www.idocbook.cn/index.php?option=com_content&task=view§ionid=3&catid=6&id=3&Itemid=7
日期正则:
(^|s|()((([1-9]){1}|([0][1-9]){1}|([1][012]){1}){1}[/-]((2[0-9]){1}|(3[01]){1}|([01][1-9]){1}|([1-9]){1}){1}[/-](((19|20)([0-9][0-9]){1}|([0-9][0-9]){1})){1}(([s|)|:])|(^|s|()((([0-9]){1}|([0][1-9]){1}|([1][012]){1}){1}[/-](([11-31]){1}|([01][1-9]){1}|([1-9]){1}){1}[/-](((19|20)([0-9][0-9]){1}|([0-9][0-9]){1})){1}(([s|)|:|$|>])){1}){1}){1}){1}
她允许:[01/01/2001 ], [01-01-2001:], [(1-1-01)]
她不允许:[13/1/2001], [1-32-2001], [1-1-1801]
转自:http://hi.baidu.com/lulufei/blog/item/590b894b9cf68df383025c55.html
日期正则:
(^|s|()((([1-9]){1}|([0][1-9]){1}|([1][012]){1}){1}[/-]((2[0-9]){1}|(3[01]){1}|([01][1-9]){1}|([1-9]){1}){1}[/-](((19|20)([0-9][0-9]){1}|([0-9][0-9]){1})){1}(([s|)|:])|(^|s|()((([0-9]){1}|([0][1-9]){1}|([1][012]){1}){1}[/-](([11-31]){1}|([01][1-9]){1}|([1-9]){1}){1}[/-](((19|20)([0-9][0-9]){1}|([0-9][0-9]){1})){1}(([s|)|:|$|>])){1}){1}){1}){1}
她允许:[01/01/2001 ], [01-01-2001:], [(1-1-01)]
她不允许:[13/1/2001], [1-32-2001], [1-1-1801]
1.验证日期的正则表达式加入闰年的判断以及思路分析进入正题之前,我们需要澄清两个概念: 一,什么是合法的日期范围?对于不同的应用场景,这个问题有不同的解释。这里采纳MSDN中的约定:
二,关于闰年的阐释。人民教育出版社小学数学室的解释浅明易懂(mediawiki等都没说明为什么整百年份必须是400的倍数时才是闰年):
清楚了以上两个概念,我们进入正题。 [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} 其中 [0-9] 也可以表示为 d,但 d 不如 [0-9] 直观,因此下面我将一直采用 [0-9]
用正则表达式验证日期的难点有二:一是大小月份的天数不同,二是闰年的考虑。 1、月份为 1, 3, 5, 7, 8, 10, 12,天数范围为 01 – 31,匹配MM-DD的正则表达式为:
2、月份为 4, 6, 9, 11,天数范围为 01-30,匹配MM-DD的正则表达式为:
3、月份为 2,考虑平年情况,匹配MM-DD的正则表达式为:
根据上面的成果,我们可以得到匹配平年日期格式为YYYY-MM-DD的正则表达式:
([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})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))) 接着我们来解决第二个难点:闰年的考虑。根据闰年的定义,我们可以将闰年分为两类: 1、能被4整除但不能被100整除的年份。寻找后两位的变化规律,可以很快得到下面的正则匹配:
2、能被400整除的年份。能被400整除的数肯定能被100整除,因此后两位肯定是00,我们只要保证前两位能被4整除即可,相应的正则表达式为:
2.最强验证日期的正则表达式,添加了闰年的验证
这个日期正则表达式支持 YYYY/MM/DD YYYY_MM_DD YYYY.MM.DD的形式 match : 2008-2-29 2008/02/29not match : 2008-2-30 2007-2-29 完整的正则表达式如下:
((^((1[8-9]d{2})|([2-9]d{3}))([-/._])(10|12|0?[13578])([-/._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]d{2})|([2-9]d{3}))([-/._])(11|0?[469])([-/._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]d{2})|([2-9]d{3}))([-/._])(0?2)([-/._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-/._])(0?2)([-/._])(29)$)|(^([3579][26]00)([-/._])(0?2)([-/._])(29)$)|(^([1][89][0][48])([-/._])(0?2)([-/._])(29)$)|(^([2-9][0-9][0][48])([-/._])(0?2)([-/._])(29)$)|(^([1][89][2468][048])([-/._])(0?2)([-/._])(29)$)|(^([2-9][0-9][2468][048])([-/._])(0?2)([-/._])(29)$)|(^([1][89][13579][26])([-/._])(0?2)([-/._])(29)$)|(^([2-9][0-9][13579][26])([-/._])(0?2)([-/._])(29)$))
闰年的2月份有29天,因此匹配闰年日期格式为YYYY-MM-DD的正则表达式为: (([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29 最后,将平年和闰年的日期验证表达式合并,我们得到最终的验证日期格式为YYYY-MM-DD的正则表达式为: (([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})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29) DD/MM/YYYY格式的正则验证表达式为: (((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([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}))|(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))) |
我用到的是一个形式为:DD/MM/YYYY格式的,上面的有问题,经过一翻努力,这样的才是对的。现在把全部代码贴出来,让各位遇到这样问题的同仁省去时间。
function CheckInput()
{
var endDateValue = document.forms[0].txtEndDate.value;
var divValidation1 = document.getElementById("divValidation1");
var divValidation2 = document.getElementById("divValidation2");
var divValidation3 = document.getElementById("divValidation3");
var regx = /(([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})/(((0[13578]|1[02])/(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)/(0[1-9]|[12][0-9]|30))|(02/(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))/02/29)/;
var s = regx.test(endDateValue);
if(!s)
{
divValidation2.style.display = "block";
return false;
}
}
有空了整理一下。
Tags: Perl, Regular Expressions
MoeFan (萌番)
近期评论