正则expression式validationdate格式dd / mm / yyyy

我需要使用正则expression式来validation格式为dd/mm/yyyy的datestring。

这正则expression式validationdd/mm/yyyy ,但不是像31/02/4500那样的无效date:

 ^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$ 

用闰年支持validationdd/mm/yyyy格式的有效正则expression式是什么?

你粘贴的正则expression式不能正确地validation闰年,但在同一篇文章中有一个 。 我将其修改为dd/mm/yyyydd-mm-yyyydd.mm.yyyy

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

我在Arun在答案中提供的链接中testing了一下,也在这里 ,它似乎工作。

我已经扩展了由@Ofir吕宋给出的正则expression式格式dd-mmm-YYYY,dd / mmm / YYYY,dd.mmm.YYYY根据我的要求。 任何有相同要求的人都可以参考这个

 ^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Feb))\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]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$ 

并在http://regexr.com/39tr1在这里testing了一些testing用例。;

为了更好地理解这个正则expression式, 在这里输入图像描述

 dd/MM/yyyy: 

检查闰年。 从1900年到9999年是有效的。 只有dd / MM / yyyy

 (^(((0[1-9]|1[0-9]|2[0-8])[\/](0[1-9]|1[012]))|((29|30|31)[\/](0[13578]|1[02]))|((29|30)[\/](0[4,6,9]|11)))[\/](19|[2-9][0-9])\d\d$)|(^29[\/]02[\/](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$) 

尝试这个。

 ^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$ 

您可以轻松地在http://www.regular-expressions.info/javascriptexample.html上testing正则expression式。;

这里是另一个正则expression式的版本,以匹配任何下列date格式,并允许省略前导零:

正则expression式: ^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$

火柴:

1/1/11 or 1.1.11 or 1-1-11 : true 01/01/11 or 01.01.11 or 01-01-11 : true 01/01/2011 or 01.01.2011 or 01-01-2011 : true 01/1/2011 or 01.1.2011 or 01-1-2011 : true 1/11/2011 or 1.11.2011 or 1-11-2011 : true 1/11/11 or 1.11.11 or 1-11-11 : true 11/1/11 or 11.1.11 or 11-1-11 : true

正则表达式可视化

Debuggex演示

对于那些看着这些,完全混淆的人,这里是我的脚本的摘录。 不幸的是,它所做的只是在date时间input中匹配有效数字,而2月31日将被标记为有效,但正如很多人所说,正则expression式真的不是做这个testing的最佳工具。

要匹配格式为“yyyy-MM-dd hh:mm”的date(或者确实按照您要求的顺序)

 var dateerrors = false; var yearReg = '(201[4-9]|202[0-9])'; ///< Allows a number between 2014 and 2029 var monthReg = '(0[1-9]|1[0-2])'; ///< Allows a number between 00 and 12 var dayReg = '(0[1-9]|1[0-9]|2[0-9]|3[0-1])'; ///< Allows a number between 00 and 31 var hourReg = '([0-1][0-9]|2[0-3])'; ///< Allows a number between 00 and 24 var minReg = '([0-5][0-9])'; ///< Allows a number between 00 and 59 var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g'); $('input').filter(function () {return this.id.match(/myhtml_element_with_id_\d+_datetime/);}).each(function (e) { if (e > 0) { // Don't test the first input. This will use the default var val = $(this).val(); if (val && !val.trim().match(reg)) { dateerrors = true; return false; } } }); if (dateerrors) { alert('You must enter a validate date in the format "yyyy-mm-dd HH:MM", eg 2019-12-31 19:30'); return false; } 

上面的脚本从构build一个正则expression式对象开始。 然后它find所有的input的id匹配一个特定的模式,然后通过这些循环。 我不testing我find的第一个input( if (e > 0) )。

一点解释:

 var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g'); 

^表示比赛开始,而$表示比赛结束。

 return this.id.match(/myhtml_element_with_id_\d+_datetime/); 

\d+表示匹配单个或连续的整数序列,因此myhtml_element_with_id_56_datetimemyhtml_element_with_id_2_datetime将匹配,但myhtml_element_with_id_5a_datetime不会

在这里find这个reg

 ^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$ 

这validation了格式mm/dd/yyyy和有效date正确(但不是m/d/yyyy )。

一些testing

我怀疑以下内容与预期的一样准确,不知道用户的语言环境何时从Julian转换到阳历。

它接受“ – ”,“/”,或无论是年,月,日之间的分隔符,无论顺序。

MMDDYYYY:

 ^(((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))[-/]?[0-9]{4}|02[-/]?29[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$ 

DDMMYYYY:

 ^(((0[1-9]|[12][0-9]|30)[-/]?(0[13-9]|1[012])|31[-/]?(0[13578]|1[02])|(0[1-9]|1[0-9]|2[0-8])[-/]?02)[-/]?[0-9]{4}|29[-/]?02[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$ 

YYYYMMDD:

 ^([0-9]{4}[-/]?((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00)[-/]?02[-/]?29)$ 

除了命令,这些都是精确到朱利安日历(闰年每四年),直到1700年,当阳历与朱利安不同。 它有两个问题:

  1. 它接受了0000年,这在许多但不是全部的标准中并不存在。 请注意,ISO 8601确实接受0000(相当于1 BCE)。
  2. 它不会跳过格里历在使用中遗失的10-13天。 虽然这个因地而异。 例如,罗马天主教会在1582年10月5日到10月14date间跳过了10天,但希腊(最后一个转换)在1923年2月16日到28日跳过了13天,不得不考虑1700年的闰年, 1800年和1900年。

这已经在从0001年到9999年的Java日历实施中进行了testing,唯一的差异是上述1582年的10天。

 "^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$" 

将validation1900-20991900-2099之间的任何date

下面的expression式很好,很容易操作:

 ((((0[13578]|1[02])(\/|-|.)(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)(\/|-|.)(0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)((\/|-|.)(0[1-9]|1[0-9]|2[0-8]))))(\/|-|.)(19([6-9][0-9])|20(0[0-9]|1[0-4])))|((02)(\/|-|.)(29)(\/|-|.)(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]))) 

它根据MM / dd / YYYY格式进行validation,并允许从1960年到2016年的闰年支持。如果您需要扩展闰年支持,则只需操作以下expression式的这一部分:

 (19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26])) 

希望这对你有很大的帮助

根据月份(mm)和年份(yyyy)validation日(dd)的另一个答案(即也validation闰年的2月29日),允许年数从0001到9999(根据格里高利日历)

 ^(?:(?:(?:0[1-9]|[12]\d|3[01])/(?:0[13578]|1[02])|(?:0[1-9]|[12]\d|30)/(?:0[469]|11)|(?:0[1-9]|1\d|2[0-8])/02)/(?!0000)\d{4}|(?:(?:0[1-9]|[12]\d)/02/(?:(?!0000)(?:[02468][048]|[13579][26])00|(?!..00)\d{2}(?:[02468][048]|[13579][26]))))$ 

在这里,我为dd/mm/yyyy写了一个分隔符,其中的分隔符可以是-.,/年范围0000-9999

它处理闰年 ,是专为正则expression式风格, 支持向前看,捕捉组和反向引用。 不适用于d/m/yyyy 。 如果需要,可以添加更多分隔符到[-.,/]

 ^(?=\d{2}([-.,\/])\d{2}\1\d{4}$)(?:0[1-9]|1\d|[2][0-8]|29(?!.02.(?!(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\d{2}(?:[02468][048]|[13579][26])))|30(?!.02)|31(?=.(?:0[13578]|10|12))).(?:0[1-9]|1[012]).\d{4}$ 

在regex101testing ; 作为Javastring:

 "^(?=\\d{2}([-.,\\/])\\d{2}\\1\\d{4}$)(?:0[1-9]|1\\d|[2][0-8]|29(?!.02.(?!(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\\d{2}(?:[02468][048]|[13579][26])))|30(?!.02)|31(?=.(?:0[13578]|10|12))).(?:0[1-9]|1[012]).\\d{4}$" 

解释:

 (?x) # modifier x: free spacing mode (for comments) # verify date dd/mm/yyyy; possible separators: -.,/ # valid year range: 0000-9999 ^ # start anchor # precheck xx-xx-xxxx,... add new separators here (?=\d{2}([-.,\/])\d{2}\1\d{4}$) (?: # day-check: non caturing group # days 01-28 0[1-9]|1\d|[2][0-8]| # february 29d check for leap year: all 4y / 00 years: only each 400 # 0400,0800,1200,1600,2000,... 29 (?!.02. # not if feb: if not ... (?! # 00 years: exclude !0 %400 years (?!(?:[02468][1-35-79]|[13579][0-13-57-9])00) # 00,04,08,12,... \d{2}(?:[02468][048]|[13579][26]) ) )| # d30 negative lookahead: february cannot have 30 days 30(?!.02)| # d31 positive lookahead: month up to 31 days 31(?=.(?:0[13578]|10|12)) ) # eof day-check # month 01-12 .(?:0[1-9]|1[012]) # year 0000-9999 .\d{4} $ # end anchor 

另请参阅SO Regex FAQ ; 请让我知道,如果失败了。

我正在使用接受MM / DD / YYYY格式的API。 我无法find任何其他的闰年和Ofir的回答 ,所以我调整了它,并重新张贴在这里为任何人可能需要它。

 /^(?:(?:(?:0[13578]|1[02])(\/)31)\1|(?:(?:0[1,3-9]|1[0-2])(\/)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:02(\/)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/ 
 ((((0[13578]|1[02])\/(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)\/(0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)(\/(0[1-9]|1[0-9]|2[0-8]))))\/(19([6-9][0-9])|20([0-9][0-9])))|((02)\/(29)\/(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048]))) 

将在19602028 1960validationMM/DD/YYYY格式

如果你需要延长闰年的支持,然后添加

 19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048]|3[26]|4[048]))) 

这也是工作

 ^((((0[13578]|1[02])[/](0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)[/](0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)([/](0[1-9]|1[0-9]|2[0-8]))))[/](19([6-9][0-9])|20([0-9][0-9])))|((02)[/](29)[/](19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048]))) 

如果你可以改变格式mm-dd-yyyy比replace[/][-]还可以在线查看http://regexr.com/

您可以使用dateMM / DD / YYYY

 ^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$ 

它validation适当的日子和飞蛾。

记住你可以检查你的正则expression式

regex101

我推荐:)

玩的开心!

 ^(((([13578]|0[13578]|1[02])[-](0[1-9]|[1-9]|1[0-9]|2[0-9]|3[01]))|(([469]|0[469]|11)[-]([1-9]|1[0-9]|2[0-9]|3[0]))|((2|02)([-](0[1-9]|1[0-9]|2[0-8]))))[-](19([6-9][0-9])|20([0-9][0-9])))|((02)[-](29)[-](19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048]))) 

这个正则expression式将validation格式的date:

(mm-dd-yyyy)或12-3-2016(mm-d-yyyy)或1-3-2016(md-yyyy)或1-30-2016(m-dd-yyyy)