【问题标题】:How to validate date format with/without zeros? [duplicate]如何验证带/不带零的日期格式? [复制]
【发布时间】:2019-12-03 08:24:29
【问题描述】:

我有验证日期(MM/dd/yyyy)格式的正则表达式。

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

有效格式示例: 03/04/1991

如果我写的是 3/04/1991 或 03/4/1991 而不是 03 或 04它不起作用。

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

【问题讨论】:

    标签: regex validation


    【解决方案1】:

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

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

    \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】:

      我看到您正在尝试使用正则表达式来强制输入数字验证。这是可行的,但通常不推荐 - 仅捕获数字并稍后验证捕获数据的有效性更简单且更具可读性:\d{1,2}[/.-]\d{1,2}[/.-]\d{4}

      特别是如果您想达到 2100 年 ;-) 这也将允许您向用户返回更多信息性错误消息:而不是“错误解析输入”,您可能会说“无效的第 13 个月”之类的内容或类似的。

      话虽如此,如果您使正则表达式足够复杂,则可以强制执行所有要求:(0?[1-9]|[12]\d|3[0-1])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-10
        • 1970-01-01
        • 1970-01-01
        • 2020-09-30
        • 1970-01-01
        相关资源
        最近更新 更多