分享
三行代码  ›  专栏  ›  技术社区  ›  Mate Gvenetadze

如何验证带/不带零的日期格式?

  •  0
  • Mate Gvenetadze  · 技术社区  · 3 天前

    我有验证日期(MM/dd/yyyy)格式的regex。

    (0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)
    

    有效格式示例: 1991年4月3日

    如果我写信 /1991年4月或3日/ /1991年代替 03年 04年 它不起作用。

    如何验证带/不带零的日期格式?

    2 回复  |  直到 3 天前
        1
  •  1
  •   The fourth bird    3 天前

    您可以将0设为可选,添加2位数字 \d\d 匹配19或20并使用单词边界后 \b .

    如果不需要捕获组,可以使用非捕获 (?: 团体`

    \b(?:0?[1-9]|1[012])[- /.](?:0?[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\d\d\b
    

    Regex demo

    如果希望使用一致的分隔符,可以使用捕获组和 backreference \1 以组中捕获的不匹配项为例 3/04-1991

    \b(?:0?[1-9]|1[012])([- /.])(?:0?[1-9]|[12][0-9]|3[01])\1(?:19|20)\d\d\b
                        ^      ^                           ^^  
    

    Regex demo

        2
  •  1
  •   Guss    3 天前

    我看到你试图使用正则表达式来强制数字的输入验证。它是可行的,但通常不建议这样做-只是捕获数字并在稍后验证捕获数据的有效性更简单、可读性更强: \d{1,2}[/.-]\d{1,2}[/.-]\d{4}

    特别是如果你想达到2100年;-)这也将允许你返回一个更具信息性的错误信息给用户:相反,“错误解析输入”你可能会说“无效的13月”之类的话。

    也就是说,如果使正则表达式足够复杂,就可以强制执行每个要求: (0?[1-9]|[12]\d|3[0-1])