我制作了一个正则表达式,完全符合所有月份。好吧,就我所见,完美无缺。它匹配每个月的01-结束,我似乎无法生成错误的月份,除非我输入的是3月32日,这是一个无效的日期。
无论如何,我需要做的是匹配正则表达式的最后yy
。如果yy
以可以除以4的数字结尾,例如20,24,16等,那么它应该只有2902yy有效。由于我没有检查yyyy
,我无法检查年份是1900年还是2000年,两者都以00
结尾。在这里你可以看到我目前的正则表达式:
(((((0[1-9]|1[0-9]|2[0-9]|30)|31)(0[13789]|(10|12)))|(((0[1-9]|1[0-9]|2[0-9]|30))(0[34569]|11))|(((0[1-9]|1[0-9]|2[0-7])|(28|29))02))(0?[0-9]|[1-9][0-9]){2})
查看我的正则表达式并在此处匹配:http://regexr.com/3buc2
不匹配:
290291
因为xx91
应该匹配:
290292
因为1992/1892/1792年有闰年
明白我的意思?我怎么可能这样做我的正则表达式?另外,我的正则表达式可以优化吗? \d
代替[0-9]
可以完成,但速度较慢,因为它也匹配不同编码中的数字,我只需要匹配0-9。
答案 0 :(得分:2)
使用正则表达式是疯狂的,或至少是临界的。但这是一个解决方案草图。
第00天到第28天应始终没问题。
如果月份不是02,第30天应该没问题。
如果月份不是02,04,06,09或11,那么第31天应该没问题。
如果月份不是02或者年份是闰年,第29天应该没问题。
由于您只有两位数的年份,我们假设您只想在本世纪运作。闰年是可以被4整除的年份。(有一些复杂情况,但它们在本世纪不适用,因为2000年可以被400和100整除。)
所以我们可以列举闰年的年份:00,04,08,12,16,20 ......
如果两位数年份的第一个数字是偶数,那么如果第二个数字是0,4或8,则年份为闰年。
如果第一个数字是奇数,如果第二个数字是2或6,则年份是闰年。
([01][0-9]|2[0-8])(0[0-9]|1[0-2])[0-9][0-9]|
30(0[013-9]|1[0-2])[0-9][0-9]|
31(0[13578]|1[02])[0-9][0-9]|
29((0[013-9]|1[0-2])[0-9][0-9]|02([0246][048]|[13579][26]))
请注意,1900-1999年你需要一个不同的正则表达式,因为闰年不同(特别是1900年不是闰年,因为它不能被400整除。)