到目前为止,下面是我的正则表达式
/^((((0?[1-9]|[12]\d|3[01])[\-\/](0?[13578]|1[02])[\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\-\/](0?[13456789]|1[012])[\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\-\/]0?2[\-\/]((1[6-9]|[2-9]\d)?\d{2}))|(29[\-\/]0?2[\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$/i
它可以完美地进行日期验证,包括闰年,但它接受的格式是dd-mm-yyyy,我想要mm-dd-yyyy。另外,它接受两位数的年份,这是我不想要的。
发布于 2013-04-01 05:38:32
哇。我真的很怀疑正则表达式在这里是不是可行的。但是,好吧,让我们试一下。
首先,重新格式化正则表达式,使其更具可读性。正如您所看到的,它由许多替代方案组成。添加评论:
/^
(
(
((0?[1-9]|[12]\d|3[01])-/-/) # dd-/-/
|
((0?[1-9]|[12]\d|30)-/-/) # dd-/-/ (uh, this seems redundant?)
|
((0?[1-9]|1\d|2[0-8])[-/]0?2-/) # dd-/-/ (february)
|
(29[-/]0?2-/)
)
|
(
(
(0[1-9]|[12]\d|3[01]) # day
(0[13578]|1[02]) # month
((1[6-9]|[2-9]\d)?\d{2}) # year
)
|
(
(0[1-9]|[12]\d|30) # day
(0[13456789]|1[012]) # month
((1[6-9]|[2-9]\d)?\d{2}) # year
)
|
(
(0[1-9]|1\d|2[0-8]) # day
02 # month
((1[6-9]|[2-9]\d)?\d{2}) # year
)
|
(
2902 # day and month
( # year in which there's a 29-02-xxxx
(1[6-9]|[2-9]\d)?
(0[48]|[2468][048]|[13579][26])
|
((16|[2468][048]|[3579][26])00)
|
00
)
)
)
)
$/i
接下来,重新排序正则表达式,将其从ddmmyyyy更改为mmddyyyy:
/^
(
(
(-/(0?[1-9]|[12]\d|3[01])-/) # -/dd-/
|
(-/(0?[1-9]|[12]\d|30)-/) # -/dd-/ (uh, this seems redundant?)
|
([-/]0?2(0?[1-9]|1\d|2[0-8])-/) # -/dd-/ (february) (I don't really get this one...)
|
([-/]0?229-/) # really confused... what kind of date format is this?
)
|
(
(
(0[13578]|1[02]) # month
(0[1-9]|[12]\d|3[01]) # day
((1[6-9]|[2-9]\d)?\d{2}) # year
)
|
(
(0[13456789]|1[012]) # month
(0[1-9]|[12]\d|30) # day
((1[6-9]|[2-9]\d)?\d{2}) # year
)
|
(
02 # month
(0[1-9]|1\d|2[0-8]) # day
((1[6-9]|[2-9]\d)?\d{2}) # year
)
|
(
0229 # day and month
( # year in which there's a 29-02-xxxx
(1[6-9]|[2-9]\d)?
(0[48]|[2468][048]|[13579][26])
|
((16|[2468][048]|[3579][26])00)
|
00
)
)
)
)
$/i
请注意,我完全被包含-/
的日期格式搞糊涂了,因此可能无法正确重写它们。
然后将其放入您的代码中。如果您不想让某人死于致命剂量的不可读正则表达式,请保留注释(如果您的编程语言允许的话)。
发布于 2013-04-01 05:10:53
从示例开发复杂正则表达式的最简单方法是使用http://txt2re.com中的正则表达式生成器
发布于 2013-04-01 05:45:47
//您可以投票否决或将此标记为“不是答案”,但我忍不住要发布这篇文章...
天哪,你为什么这么恨自己?
正则表达式是一个强大而有用的工具,但它不能解决这个世界上的所有问题。我一次又一次地看到像这样解析日期的尝试--考虑到闰年,或者使用正则表达式解析XML/HTML。
这是错误的。
您的正则表达式是不可读和不可维护的(您已经在这个问题中证明了这一点)。构建这样的怪物正则表达式作为练习可能很好,但您甚至不应该考虑在生产环境中使用它。
原因是(举几个例子!):
学会为特定用途的选择正确的工具。不存在一个通用的“我可以做任何事情都好”的工具。
https://stackoverflow.com/questions/15734549
复制相似问题