我需要用常规的expresssion来验证dd/mm/yyyy格式的日期字符串。
此正则表达式验证dd/mm/yyyy,但不验证31/02/4500等无效日期
^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$什么是验证支持闰年的dd/mm/yyyy格式的有效正则表达式?
发布于 2013-03-20 00:19:56
您粘贴的正则表达式不能正确验证闰年,但有一个可以验证in the same post。我将其修改为使用dd/mm/yyyy、dd-mm-yyyy或dd.mm.yyyy。
^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-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的答案和here中提供的链接中测试了一下,它似乎可以工作。
编辑2019年2月14日:我删除了正则表达式中的逗号,它允许像29-0,-11这样的日期
发布于 2014-11-17 19:56:10
我已经根据我的要求将@Ofir Luzon给出的正则表达式扩展为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测试了一些测试用例。
要更好地理解此正则表达式,请参阅下图:

https://regex101.com/r/3TZfyU/1:将其扩展为yyyy/mm/dd,yyyy-mm-dd或yyyy.mm.dd某些测试用例
^(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:(\/|-|\.)(?:0?[13578]|1[02])\1(?:31))|(?:(\/|-|\.)(?:0?[13-9]|1[0-2])\2(?:29|30)))$|
^(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\/|-|\.)0?2\3(?:29)$|
^(?:(?:1[6-9]|[2-9]\d)?\d{2})(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:0?[1-9]|1\d|2[0-8])$发布于 2013-12-25 21:47:44
注意:
您的正则表达式在“是4和100的倍数,但不是400的倍数”的年份不起作用。通过测试的年份不是闰年。例如: 1900、2100、2200、2300、2500等。换言之,它将格式为\d\d00的所有年份放在同一类别的闰年中,这是不正确的。-- MuchToLearn
因此,它只适用于1901 - 2099
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)$)https://stackoverflow.com/questions/15491894
复制相似问题