史上最详细的js日期正则表达式分享

 更新时间:2014年06月10日 15:14:11   作者:  
最近项目经常要用到日期的正则表达式,就上度娘查了下,整理出来,分享给大家

最简单的正则 如 : /d{4}-/d{2}-/d{2}
但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题.....

对于日期的有效范围,不同的应用场景会有所不同。MSDN中定义的DateTime对象的有效范围是:0001-01-01 00:00:00到9999-12-31 23:59:59。

UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z。

先考虑与年份无关的前三条规则,年份可统一写作

(?!0000)[0-9]{4}

下面仅考虑月和日的正则

1. 包括平年在内的所有年份的月份都包含1-28日

(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])

2. 包括平年在内的所有年份除2月外都包含29和30日

(0[13-9]|1[0-2])-(29|30)

3. 包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日

(0[13578]|1[02])-31)

合起来就是除闰年的2月29日外的其它所有日期

(?!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)

接下来考虑闰年的实现

1 : 四年一闰
([0-9]{2}(0[48]|[2468][048]|[13579][26])

2 : 百年不闰,四百年再闰
(0[48]|[2468][048]|[13579][26])00

3 : 合起来就是所有闰年的2月29日
([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)

四条规则都已实现,且互相间没有影响,合起来就是所有符合DateTime范围的日期的正则

^((?!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)$

考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。

^(?:(?!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)$
分类: JavaScript

 


  js 日期正则表达式支持月日验证
这款js 日期正则表达式支持月日验证,我们会一一举例说明一下有关日期验证表达式的函数实例了.

function isdate(str){
var result=str.match(/^(d{4})(-|/)(d{1,2})2(d{1,2})$/);
if(result==null) return false;
var d=new Date(result[1], result[3]-1, result[4]);
return (d.getFullYear()==result[1] && d.getMonth()+1==result[3] && d.getDate()==result[4]);
}

检查是否为 YYYY-MM-DD || YYYY/MM/DD 的日期格式


面仅考虑月和日的正则

1. 包括平年在内的所有年份的月份都包含1-28日

(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])
2. 包括平年在内的所有年份除2月外都包含29和30日

(0[13-9]|1[0-2])-(29|30)
3. 包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日

(0[13578]|1[02])-31)
合起来就是除闰年的2月29日外的其它所有日期

(?!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)
function isdatetime(str)
{
var result=str.match(/^(d{4})(-|/)(d{1,2})2(d{1,2}) (d{1,2}):(d{1,2}):(d{1,2})$/);
if(result==null) return false;
var d= new Date(result[1], result[3]-1, result[4], result[5], result[6], result[7]);
return (d.getFullYear()==result[1]&&(d.getMonth()+1)==result[3]&&d.getDate()==result[4]&&d.getHours()==result[5]&&d.getMinutes()==result[6]&&d.getSeconds()==result[7]);
}

// 判断输入是否是有效的长日期格式 - "YYYY-MM-DD HH:MM:SS" || "YYYY/MM/DD HH:MM:SS"


这是yyyy-mm-dd hh:mm:ss 的

/^(d{4})-(d{2})-(d{2}) (d{2}):(d{2}):(d{2})$/ ;

这是 yyyy-mm-ddde 的

/^(d{4})-(d{2})-(d{2})$/

相关文章

  • 正则表达式小结篇

    正则表达式小结篇

    本文是小编给大家收集整理的关于正则表达式小结,非常不错,具有参考借鉴价值,需要的朋友一起看看吧
    2016-12-12
  • js正则表达式之replace函数用法

    js正则表达式之replace函数用法

    replace函数返回根据正则表达式进行文字替换后的字符串的复制
    2012-10-10
  • ip138中各种客户端验证js代码

    ip138中各种客户端验证js代码

    包括ip验证,身份证验证,手机号码验证,电话号码,邮政编码验证,域名验证等,其实好的代码,都在应用中,大家多去扒代码吧。
    2009-12-12
  • Java正则表达式使用

    Java正则表达式使用

    本篇文章主要给大家介绍java在正则表达式的使用,本篇文章给大家主要介绍应用点在抓取网页中的email地址和代码统计,感兴趣的朋友一起看看吧
    2015-09-09
  • 正则表达式[\s\S]*与[\w\W]* 什么意思

    正则表达式[\s\S]*与[\w\W]* 什么意思

    很多人咨询[\s\S]*与[\w\W]* 什么意思,不是有.了吗,那么它们的组合,表示所有的都匹配,与它相对应的,有[\w\W]等,意义完全相同,需要的朋友可以参考下
    2020-03-03
  • 正则表达式从HTML中匹配img标签的图片地址

    正则表达式从HTML中匹配img标签的图片地址

    最近有一个项目要获取页面中所有img标签中的图片地址,这篇文章主要给大家介绍了关于正则表达式如何从HTML中匹配img标签的图片地址的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • js正则表达式基本语法(精粹)

    js正则表达式基本语法(精粹)

    本篇文章给大家介绍正则表达式基本语法,学习正则表达式的基本语法是学习编程的基础,正则表达式在程序中应用非常广泛,有需要的朋友跟着脚本之家的小编一起学习吧
    2015-09-09
  • 如何使用正则表达式对输入数字进行匹配详解

    如何使用正则表达式对输入数字进行匹配详解

    正则表达式用于字符串处理、表单验证等场合,实用高效,下面这篇文章主要给大家介绍了关于如何使用正则表达式对输入数字进行匹配的相关资料,文中介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 正则表达式常见的4种匹配模式小结

    正则表达式常见的4种匹配模式小结

    今天一起来学习下正则中的匹配模式,所谓的匹配模式,就是指正则中的一些 改变元字符匹配行为 的方式,比如匹配时不区分英文字母的大小写,具有一定的参考价值,感兴趣的可以了解一下
    2021-07-07
  • asp的ubb函数(推荐)

    asp的ubb函数(推荐)

    asp的ubb函数(推荐)...
    2006-06-06

最新评论