javascript正则表达式iso datetime

Sco*_*ach 50 javascript regex datetime iso

有没有人有一个良好的正则表达式模式匹配iso日期时间?

即:2010-06-15T00:00:00

Bro*_*ams 89

对于W3C对规范的严格,完整的日期时间(包括毫秒):

//-- Complete precision:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/

//-- No milliseconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)/

//-- No Seconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)/

//-- Putting it all together:
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/
Run Code Online (Sandbox Code Playgroud)

.
实际ISO 8601:2004(E)doc允许的其他变体:

/********************************************
**    No time-zone varients:
*/
//-- Complete precision:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+/

//-- No milliseconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d/

//-- No Seconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d/

//-- Putting it all together:
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+)|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d)|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d)/
Run Code Online (Sandbox Code Playgroud)

警告:这一切都变得混乱,并且它仍然允许某些废话,例如第14个月.此外,ISO 8601:2004(E)允许其他几种变体.

.
"2010-06-15T00:00:00"不合法,因为它没有时区指定.

  • 哇.这个答案在角度源代码中引用!@BrockAdams (4认同)
  • 这将在闰秒失败,即偶尔的第61秒. (3认同)
  • ISO-8601 表示,如果省略时区,则假定为 UTC,这包括“Z”。 (2认同)
  • 感谢您的正则表达式。为了稍微调整一下,我们可以使用 `(?: )` 而不是 `( )` 来避免捕获一个组。例如`\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(? :[+-][0-2]\d:[0-5]\d|Z)` 用于第一个正则表达式。 (2认同)

小智 12

我已经制作了这个正则表达式并解决了日期验证问题,因为它们来自 Javascript 的.toISOString()方法。

^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])\.[0-9]{3}Z$

设想:

  • 在适当的位置使用适当的符号(“-”、“T”、“:”、“.”、“Z”)。
  • 与 29 天、30 天或 31 天的月份一致。
  • 营业时间为 00 点至 23 点。
  • 分钟和秒从 00 到 59。
  • 从 000 到 999 的毫秒。

未考虑:

  • 闰年。

日期示例: 2019-11-15T13:34:22.178Z

直接在 Chrome 控制台中运行的示例: /^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])\.[0-9]{3}Z$/.test("2019-11-15T13:34:22.178Z");

正则表达式流程图(Regexper): 正则表达式流程图


dbe*_*ach 7

我将最重要的答案重新设计得更加简洁。元素不嵌套三个可选模式,而是嵌套为可选语句。

/[+-]?\d{4}(-[01]\d(-[0-3]\d(T[0-2]\d:[0-5]\d:?([0-5]\d(\.\d+)?)?[+-][0-2]\d:[0-5]\dZ?)?)?)?/

我很好奇这种方法是否有缺点?

您可以在此处找到针对我的建议答案的测试:http : //regexr.com/3e0lh


Ser*_*ure 7

要仅匹配ISO日期(例如2017-09-22),可以使用以下正则表达式:

^\d{4}-([0]\d|1[0-2])-([0-2]\d|3[01])$
Run Code Online (Sandbox Code Playgroud)

它将匹配任何数字年份,由00-12范围内的两位数字指定的任何月份以及由00-31范围内的两位数字指定的任何日期

  • 00 如何对月份或日期有效? (2认同)
  • 它与“2023-02-30”一样有效。最终,正则表达式不适合验证日期是否正确,只能用于指示预期的格式。鉴于此,更容易阅读但允许出现一些明显错误的较短格式是一个很好的折衷方案。因此,我实际上更喜欢 `^\d{4}-\d{2}-\d{2}$` 。 (2认同)

Rbj*_*bjz 5

这是一个正则表达式,用于检查ISO 8601 日期格式,包括闰年和短长时间.要运行它,您需要"忽略空白".regexlib上有一个没有空格的压缩版本:http: //regexlib.com/REDetails.aspx?regexp_id = 3344

ISO 8601还有更多 - 这个正则表达式只关心日期,但您可以轻松扩展它以支持时间验证,这并不是那么棘手.

更新:现在使用javascript(没有lookbehinds)

  ^(?:
      (?=
            [02468][048]00
            |[13579][26]00
            |[0-9][0-9]0[48]
            |[0-9][0-9][2468][048]
            |[0-9][0-9][13579][26]              
      )

      \d{4}

      (?:

        (-|)

        (?:

            (?:
                00[1-9]
                |0[1-9][0-9]
                |[1-2][0-9][0-9]
                |3[0-5][0-9]
                |36[0-6]
            )
            |
                (?:01|03|05|07|08|10|12)
                (?:
                  \1
                  (?:0[1-9]|[12][0-9]|3[01])
                )?            
            |
                (?:04|06|09|11)
                (?:
                  \1
                  (?:0[1-9]|[12][0-9]|30)
                )?            
            |
                02
                (?:
                  \1
                  (?:0[1-9]|[12][0-9])
                )?

            |
                W(?:0[1-9]|[1-4][0-9]|5[0-3])
                (?:
                  \1
                  [1-7]
                )?

        )            
      )?
  )$
  |
  ^(?:
      (?!
            [02468][048]00
            |[13579][26]00
            |[0-9][0-9]0[48]
            |[0-9][0-9][2468][048]
            |[0-9][0-9][13579][26]              
      )

      \d{4}

      (?:

        (-|)

        (?:

            (?:
                00[1-9]
                |0[1-9][0-9]
                |[1-2][0-9][0-9]
                |3[0-5][0-9]
                |36[0-5]
            )
            |
                (?:01|03|05|07|08|10|12)
                (?:
                  \2
                  (?:0[1-9]|[12][0-9]|3[01])
                )?

            |
                (?:04|06|09|11)
                (?:
                  \2
                  (?:0[1-9]|[12][0-9]|30)
                )?
            |
                (?:02)
                (?:
                  \2
                  (?:0[1-9]|1[0-9]|2[0-8])
                )?
            |
                W(?:0[1-9]|[1-4][0-9]|5[0-3])
                (?:
                  \2
                  [1-7]
                )?
       ) 
    )?
)$
Run Code Online (Sandbox Code Playgroud)

为了适应时间,可以在混合物中添加这样的东西(来自:http: //underground.infovark.com/2008/07/22/iso-date-validation-regex/):

([T\s](([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)?(\15([0-5]\d))?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?
Run Code Online (Sandbox Code Playgroud)