【问题标题】:regex date validation正则表达式日期验证
【发布时间】:2018-04-09 14:20:21
【问题描述】:

我想知道如何将年份设为强制性 4 位数字

参考:https://stackoverflow.com/a/26972181/3541735

我的正则表达式稍作调整,不允许使用“/”或“。”并且只有几个月的数字:

^(?:(?:31(-)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(-)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(-)(?:0?2)\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(-)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

Debuggex Demo

【问题讨论】:

  • {4,} 是您要搜索的内容。但是这个正则表达式太复杂了......需要一些时间来弄清楚把它放在哪里......
  • 这似乎可以通过验证DateTime::createFromFormat的输出得到更好的解决
  • 对于纯正则表达式解决方案,我已修改正则表达式以强制要求 4 位年份。虽然,正则表达式有点复杂。

标签: php regex validation date


【解决方案1】:

考虑到正则表达式的复杂性,要​​求 4 位数的年份有点棘手,但在 Debuggex 的帮助下,我能够找到 ? 允许将年份指定为的三个位置2 或 4 位数字。通过删除这三个出现的?,现在要求年份包含所有 4 位数字。否则,前 2 位数字是可选的。

^(?:(?:31(-)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(-)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)\d{2})$|^(?:29(-)(?:0?2)\3(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(-)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)\d{2})$

这是更新的正则表达式的可视化表示。请注意,三个旁路循环不再出现在年份的前两位数字上。

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多