正则表达式匹配日期

我希望匹配日期格式为mm / dd / yy或mm / dd / yyyy,但它不应该选择23/09/2010,其中月份为23,这是无效的,也没有一些无效的日期,如00/12/2020或12/00 / 2011。

您最好对/并测试所有单个部件进行拆分。 但如果你真的想使用正则表达式,你可以试试这个:

#\A(?:(?:(?:(?:0?[13578])|(1[02]))/31/(19|20)?\d\d)|(?:(?:(?:0?[13-9])|(?:1[0-2]))/(?:29|30)/(?:19|20)?\d\d)|(?:0?2/29/(?:19|20)(?:(?:[02468][048])|(?:[13579][26])))|(?:(?:(?:0?[1-9])|(?:1[0-2]))/(?:(?:0?[1-9])|(?:1\d)|(?:2[0-8]))/(?:19|20)?\d\d))\Z# 

说明:

 \A # start of string (?: # group without capture # that match 31st of month 1,3,5,7,8,10,12 (?: # group without capture (?: # group without capture (?: # group without capture 0? # number 0 optionnal [13578] # one digit either 1,3,5,7 or 8 ) # end group | # alternative (1[02]) # 1 followed by 0 or 2 ) # end group / # slash 31 # number 31 / # slash (19|20)? #numbers 19 or 20 optionnal \d\d # 2 digits from 00 to 99 ) # end group | (?:(?:(?:0?[13-9])|(?:1[0-2]))/(?:29|30)/(?:19|20)?\d\d) | (?:0?2/29/(?:19|20)(?:(?:[02468][048])|(?:[13579][26]))) | (?:(?:(?:0?[1-9])|(?:1[0-2]))/(?:(?:0?[1-9])|(?:1\d)|(?:2[0-8]))/(?:19|20)?\d\d) ) \Z 

我已经解释了第一部分,剩下的就是练习。

这个匹配一个无效的日期:02/29/1900但是对于01/01/1900和12/31/2099之间的任何其他日期是正确的

比疯狂的巨大正则表达式更好(假设这是用于validation而不是扫描):

 require 'date' def valid_date?( str, format="%m/%d/%Y" ) Date.strptime(str,format) rescue false end 

而作为一篇社论:Eww! 你为什么要使用如此可怕的日期格式呢? 选择ISO8601, YYYY-MM-DD ,这是一个有效的国际标准,具有一致的零件订购,并按字典顺序排序。

或者你只是使用Date.parse "some random date"
如果解析失败,您将得到ArgumentException(=> Date无效)。

参见例如http://santoro.tk/mirror/ruby-core/classes/Date.html#M000644

使用regexp可以做的最好的事情是validation格式,例如:

 [0-1][0-9]/[0-3][0-9]/[0-9]{2}(?:[0-9]{2})? 

没有某种日期字典,除此之外的任何事情都无法可靠地完成。 例如,日期的有效性取决于它是否是闰年。

对于MM-DD-YYYY您可以使用以下正则表达式。 它将适用于闰年,并且仅在正确的日期匹配,除非年份不超过2099年。

 (?:(09|04|06|11)(\/|-|\.)(0[1-9]|[12]\d|30)(\/|-|\.)((?:19|20)\d\d))|(?:(01|03|05|07|08|10|12)(\/|-|\.)(0[1-9]|[12]\d|3[01])(\/|-|\.)((?:19|20)\d\d))|(?:02(\/|-|\.)(?:(?:(0[1-9]|1\d|2[0-8])(\/|-|\.)((?:19|20)\d\d))|(?:(29)(\/|-|\.)((?:(?:19|20)(?:04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))|2000)))) 

http://regexr.com/中的结帐比赛

所以你想要一个匹配为mm / dd / yy的正则表达式

 ^((0?1?1){1}|(0?1?2){1}|([0]?3|4|5|6|7|8|9))\/((0?1?2?3?1){1}|(0?1?2?(2|3|4|5|6|7|8|9|0))|(30))\/[1-90]{4}$ 

这个正则表达式将完全匹配你想要的那种格式mm / dd / yy一个不会validation任何假日期你可以测试regex101上的正则表达式你可以测试日期12/30/2040和09/09/2020以及什么你想要那种格式我觉得这也是你可以找到的那种格式的最短正则表达式

这是代码而不是你可以使用:),试试看并告诉我:

 ^([0-2][0-9]|(3)[0-1])(\/)(((0)[0-9])|((1)[0-2]))(\/)\d{4}$