【问题标题】:how to do regex date format change?如何更改正则表达式日期格式?
【发布时间】:2021-03-12 08:44:15
【问题描述】:

目前正则表达式下面的日期可以正常工作,但我希望它接受那些也有单个数字的日期和月份。我该怎么做?

正则表达式也应该接受以下格式:

“2021 年 11 月 4 日”或“2021 年 1 月 4 日”或“2021 年 1 月 4 日”

dateString = '11/04/2021'

let dateformat = /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(([1][26]|[2468][048]|[3579][26])00))))$/g;      
              
if(dateString.match(dateformat)){      
    let operator = dateString.split('/');     
    console.log(operator)
}

【问题讨论】:

  • 我在这里的一般建议是将文本解析为适当的日期并以这种方式进行验证。使用正则表达式验证日期有各种各样的问题,例如二月份有 28 天,闰年除外,它有 29 天。
  • 我建议您先拆分字符串,然后使用 3 个不同的正则表达式来匹配每个部分。如果不是至少将那个怪物分成多行。你有 4 个正则表达式,你 |一起。这将减少重复。如果您不需要所有这些捕获组,请使用 (?:...)。我同意蒂姆的观点。使用 Date.parse()。
  • 这能回答你的问题吗? Regular Expression | Leap Years and More
  • @TimBiegeleisen 看起来像最后一个正则表达式 (29\/02) 处理闰年。
  • @AllanWind 如果我没看错的话,它承认 任何年的 2 月有 29 天。

标签: javascript node.js regex express


【解决方案1】:

不要。请改用Date.parse()

【讨论】:

    【解决方案2】:

    月份:^0{1}[1-9]$|^[1-9]{1}$|^1[012]{1}$

    第一部分带0,第二部分不带0,最后一个为10、11、12。

    几天:^0{1}[1-9]{1}$|^[1-9]{1}$|^[12]{1}[0-9]{1}$|^3[01]{1}$

    第一个是从 1 到 9 以 0 开头的天数,第二个是相同的天数,但没有 0。

    如果最大天数是 31、30 或 28,我会使用 javascript。

    【讨论】:

      【解决方案3】:

      您可以通过向第 8 组添加 1 到 9 个字符的 OR 语句来实现请求。这就是那些日子。几个月也是如此。

      让我举个例子。 您现在的匹配组如下所示:

      (0[1-9]|[12]\d|30)
      

      这意味着您接受所有以 0 开头的数字和之后从 1 到 9 的数字,以 1 或 2 开头的数字以及之后的任何数字,或 30。

      为了接受从 1 到 9 的数字,您必须向匹配组添加另一个条件,即 1 到 9 位。因此,您的组将如下所示:

      (0[1-9]|[12]\d|30|[1-9])
      

      这是您可以做的最基本的事情。有很多方法可以优化这个正则表达式并以更好的方式进行。您可以考虑一下每月的第 31 天,因为现在它没有捕捉到它。

      与我在示例中显示的天匹配组相同的方式,您可以对月份匹配组执行此操作。

      【讨论】:

        猜你喜欢
        • 2011-12-31
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 2012-06-20
        • 1970-01-01
        相关资源
        最近更新 更多