【问题标题】:Regex to match several date formats [duplicate]正则表达式匹配多种日期格式[重复]
【发布时间】:2020-06-16 14:57:31
【问题描述】:

我想将 1900-01-01 与 2099-12-31 匹配为以下每种格式:

YYYY
YYYY-MM
YYYY-MM-DD

这是我目前的解决方案:

^(19|20)[0-9]{1}[0-9]{1}-?([0,1]{0,1}[0-2]{0,1}){0,1}-?([0-3]{0,1}[0-9]{0,1}){0,1}

但我的解决方案至少有 4 个我无法修复的严重错误:

  1. 1921-00 匹配成功

    在我的解决方案中没有限制“月份或日期的 2 位数字中只有 1 位可以为 0,但不能同时为 0”

  2. 1921- 匹配成功

    我的解决方案中没有“日期的最后一个符号只能是数字,不能是连字符”的限制

  3. 1921-1 匹配成功

    在我的解决方案中没有限制“月份和日期只能包含 0 或 2 位数字,而不是 1 位数字”

还有主要的:

  1. 1921-22 匹配成功

    我的解决方案中没有“没有月份就不能存在日期”的限制

我正在使用 Python(如果重要的话)。 如果能在我的解决方案中添加此限制,我将不胜感激。

【问题讨论】:

  • 不熟悉python但[0,1]应该是[01] 0或1,逗号允许逗号。要允许月份范围,请使用 0[1-9]|1[0-2]
  • 你预计会遇到 736 年吗?
  • @MonkeyZeus 没有。日期应该在 1900-01-01 到 2099-12-31 之间
  • 您对验证闰年日期感兴趣吗? 2010-02-31 呢?
  • 事实上,stackoverflow.com/a/8648129/2191572 的范围是 1800-2099,可以轻松调整以满足您的需求。你应该去投票这个答案

标签: python regex


【解决方案1】:

您可以使用datetime 模块:

from datetime import datetime
dateformats = ("%Y", "%Y-%m", "%Y-%m-%d")
dates = ("2020", "2020-06", "2020-06-16", "2020-15", "2020-16-06", "1875-10-20")

for date_str in dates:
    for date_fmt in dateformats:
        try:
            date = datetime.strptime(date_str, date_fmt)
        except ValueError:
            pass
        else:
            if 1900 <= date.year <= 2099:
                print(f"{date_str} is valid.")
            else:
                print(f"{date_str} is not in valid range.")
            break
    else:
        print(f"{date_str} is not valid.")

输出:

2020 年有效。 2020-06 有效。 2020-06-16 有效。 2020-15 无效。 2020-16-06 无效。 1875-10-20 不在有效范围内。

【讨论】:

    【解决方案2】:

    这样的事情似乎有效:

    ^(19|20)\d{2}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12][0-9]|3[01]))?)?$
    
    • (19|20)\d{2} - 19 或 20 后跟 2 位数字
    • (?: - 启动非捕获组,因为我们需要一些 OR 布尔值
    • -(?:0[1-9]|1[0-2]) - 破折号后跟 01-12 之间的一个月
    • (?:-(?:0[1-9]|[12][0-9]|3[01]))? - 01-31 的可选日期
    • )? - 将月份设为可选。可选的日期在这些括号内,因为我们只关心前一个月的日期。

    https://regex101.com/r/oj5c1K/1/

    【讨论】:

    • 由于此答案已修复所有有问题的错误,因此我将其标记为正确。感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多