使用正则表达式匹配 yyyymmdd 中的日期格式

Posted

技术标签:

【中文标题】使用正则表达式匹配 yyyymmdd 中的日期格式【英文标题】:Using regex to match date format in yyyymmdd 【发布时间】:2015-06-01 04:47:05 【问题描述】:

正则表达式应匹配YYYYMMDD 格式的字符串中的有效日期。例如,aaa_20150327_bbb 应该匹配,但 aaa_20150229_bbb 不是因为 2015 年不是闰年。

只需要考虑从 20002099 的年份。

【问题讨论】:

如果不是使用正则表达式的闰年,将无法排除 2/29。至少不是以理智的方式。你必须在事后分析出来。 \d8 有问题吗?或者至少20\d2[01]\d[0123]\d @JoeWang 你用的是什么语言? C++ 具有内置功能,无需使用正则表达式 啊...... re 是如何实现这一点的......只需对 re 是什么进行 5 分钟的研究,就可以排除这种可能性。 这不是 RegEx 的合适问题。幸运的是,有很好的库可以处理日期。提取字符串,然后使用日期解析库将其用作日期。 看看:***.com/a/3873172/372239 【参考方案1】:

我的方式(不是理智的方式)

(((\d4)(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))|((\d4)(0[469]|11)(0[1-9]|[12][0-9]|30))|((\d4)(02)(0[1-9]|1[0-9]|2[0-8]))|([0-9][0-9][02468]40229)|([0-9][0-9][02468]80229)|([0-9][0-9][13579]20229)|([0-9][0-9][13579]60229)|([0-9][0-9][02468]00229))

用vb.net(我觉得比较容易理解)

    Dim meses31 As String = "((\d4)(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))"
    Dim meses30 As String = "((\d4)(0[469]|11)(0[1-9]|[12][0-9]|30))"
    Dim febrero28 As String = "((\d4)(02)(0[1-9]|1[0-9]|2[0-8]))"
    Dim febrero29 As String = "([0-9][0-9][02468]40229)|([0-9][0-9][02468]80229)|([0-9][0-9][13579]20229)|([0-9][0-9][13579]60229)|([0-9][0-9][02468]00229)"

    Dim patternFecha As String = String.Concat("(", meses31, "|", meses30, "|", febrero28, "|", febrero29, ")")

【讨论】:

【参考方案2】:

完全疯狂(0-9999 年)

以下一个(基于 this 答案)适用于 0 到 9999 之间的年份。

(?<!\d)(?:(?:(?:1[6-9]|[2-9]\d)?\d2)(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))0229)|(?:(?:1[6-9]|[2-9]\d)?\d2)(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d)

(查看demo)


完全疯狂简化(2000-2099 年)

如果您愿意,可以将其简化为仅在 2000 年到 2099 年之间工作。

(?<!\d)(?:(?:20\d2)(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:20(?:0[48]|[2468][048]|[13579][26]))0229)|(?:20\d2)(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d)

但正如您所见,它并不是真的更简单。

(查看demo)


理智的方式(年*)

为了保持理智,您应该坚持使用非常简单的正则表达式,然后使用代码对其进行验证。

(20\d2)(\d2)(\d2)

(查看demo)

【讨论】:

+ 表示“理智”的方式!我很想在正则表达式中执行健全性测试,然后(在需要时)使用不同的方法来导航和日历 weirdness 最后一个为什么不用(20\d6) @IanS 为什么不呢?因为我想要三个单独的捕获组,以便在创建日期对象时可以使用年、月和日的单独匹配。示例:new Date(match[1], match[2] - 1, match[3])

以上是关于使用正则表达式匹配 yyyymmdd 中的日期格式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 MM DD YYYY 到 YYYY MM DD

使用 python 正则表达式匹配日期

java验证日期"yyyyMMdd"正则表达式,

正则表达式以匹配西班牙日期

java 判定日期是否符合yyyy-mm-dd

通过匹配字符串中的日期格式使用Java提取日期