正则表达式匹配日期类型:ddmmyyyy

时间:2014-01-14 22:41:22

标签: regex

我正在尝试匹配类型的日期: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几乎相同但没有分隔符((\/|-|\.)

3 个答案:

答案 0 :(得分:3)

你可以使用更简单的东西:

^(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

说明:

- 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

答案 1 :(得分:1)

不要仅使用RegEx验证日期。您的语言可能有一个带有自己方法的内置日期对象,您可以将其与您使用RegEx验证的格式的输入结合使用。

答案 2 :(得分:0)

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

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

更详细一点:

  1. 匹配^(\d\d)(\d\d)(\d\d\d\d)$(根据需要调整语法)。
  2. 提取三个匹配的组,并以编程方式检查它们是否构成有效日期。
  3. 后者需要(a)知道每个月的天数,以及(b)知道哪些年是闰年(这取决于你使用的是哪个日历;格里高利是明显的选择,但想想几年前它被介绍了。)

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

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