首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将此正则表达式转换为接受mm-dd-yyyy格式?

如何将此正则表达式转换为接受mm-dd-yyyy格式?
EN

Stack Overflow用户
提问于 2013-04-01 05:08:46
回答 3查看 586关注 0票数 2

到目前为止,下面是我的正则表达式

/^((((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。另外,它接受两位数的年份,这是我不想要的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-01 05:38:32

哇。我真的很怀疑正则表达式在这里是不是可行的。但是,好吧,让我们试一下。

首先,重新格式化正则表达式,使其更具可读性。正如您所看到的,它由许多替代方案组成。添加评论:

代码语言:javascript
运行
复制
/^
 (
  (
   ((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:

代码语言:javascript
运行
复制
/^
 (
  (
   (-/(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

请注意,我完全被包含-/的日期格式搞糊涂了,因此可能无法正确重写它们。

然后将其放入您的代码中。如果您不想让某人死于致命剂量的不可读正则表达式,请保留注释(如果您的编程语言允许的话)。

票数 1
EN

Stack Overflow用户

发布于 2013-04-01 05:10:53

从示例开发复杂正则表达式的最简单方法是使用http://txt2re.com中的正则表达式生成器

票数 3
EN

Stack Overflow用户

发布于 2013-04-01 05:45:47

//您可以投票否决或将此标记为“不是答案”,但我忍不住要发布这篇文章...

天哪,你为什么这么恨自己?

正则表达式是一个强大而有用的工具,但它不能解决这个世界上的所有问题。我一次又一次地看到像这样解析日期的尝试--考虑到闰年,或者使用正则表达式解析XML/HTML。

这是错误的。

您的正则表达式是不可读和不可维护的(您已经在这个问题中证明了这一点)。构建这样的怪物正则表达式作为练习可能很好,但您甚至不应该考虑在生产环境中使用它。

原因是(举几个例子!):

  • 正确性:您甚至不确定这是否有效。您将花费数小时对其进行分析和测试。
  • 性能:这种大小的正则表达式可能需要很长时间才能执行。
  • 错误输出:正则表达式只给出"matches / does match“结果。您没有机会告诉用户,他输入的日期在语法上是无效的,还是2月29日在这一年中不存在。

学会为特定用途的选择正确的工具。不存在一个通用的“我可以做任何事情都好”的工具。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15734549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档