首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配类型日期的Regex : ddmmyyyy

匹配类型日期的Regex : ddmmyyyy
EN

Stack Overflow用户
提问于 2014-01-14 22:41:22
回答 3查看 8.2K关注 0票数 4

我正在尝试匹配类型为:ddmmyyyy的日期,例如:04072001,到目前为止,我有以下内容:

^(?:(?:31(?:0?[13578]|1[02]))\1|(?:(?:29|30)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:290?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})$

它几乎与here相同,但没有分隔符( (\/|-|\.) )。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-14 22:56:33

您可以使用一些更简单的东西,比如:

代码语言:javascript
运行
复制
^(0[1-9]|[1-2][0-9]|31(?!(?:0[2469]|11))|30(?!02))(0[1-9]|1[0-2])([12]\d{3})$

它捕获日期、月份、年份,并验证一切,除了2月29日是否实际上是闰年。(要做到这一点,我只需对随后捕获的年份/日期进行计算,而不是试图将其写入表达式中)。

工作示例:http://regex101.com/r/dH8mG3

解释:

代码语言:javascript
运行
复制
- Capture the day: 01-29
    - OR 31, if not succeeded by 02, 04, 06, 09, or 11
    - OR 30, if not succeeded by 02

- Capture the month: 01-12
- Capture the year: 1000-2999 (you could narrow this down 
                               by using number ranges like
                               (1[8-9]\d{2}|20\d{2}) == 1800-2099
票数 6
EN

Stack Overflow用户

发布于 2014-01-14 23:42:19

正则表达式不是这项工作的最佳工具。

如果有可能,只需匹配^\d{8}$ (如果regexp引擎不支持{8}语法,则为^\d\d\d\d\d\d\d\d$ ),然后以编程方式检查日期是否有效。

更详细的是:

  1. 匹配^(\d\d)(\d\d)(\d\d\d\d)$ (根据需要调整语法)。
  2. 提取三个匹配组并以编程方式检查它们是否构成有效日期。

后者要求:(a)知道每个月的天数,(b)知道哪一年是闰年(这取决于你使用的是哪个日历;格里高利是显而易见的选择,但想想引入之前的年份)。

生成的代码将更易于阅读和维护。

(此外,如果您对格式有任何控制,请考虑使用YYYYMMDD而不是DDMMYYYY;它排序正确,是ISO 8601标准指定的格式之一。)

票数 0
EN

Stack Overflow用户

发布于 2014-01-14 23:48:42

不要仅使用RegEx验证日期。您的语言可能有一个内置的date对象,它有自己的方法等等,您可以结合输入使用它的格式,您已经用RegEx验证了它的格式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21125558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档