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

时间:2015-03-27 18:30:51

标签: regex date nsregularexpression leap-year

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

只需要考虑从 2000 2099 的年份。

2 个答案:

答案 0 :(得分:14)

总疯狂(0-9999年)

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

(?<!\d)(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:(?: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)?\d{2})(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d)

(查看demo


总疯狂简化(2000 - 2099年)

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

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

但是你可以看到它并不是那么简单。

(查看demo


理智的方式(年*)

为了保持理智,你应该坚持使用一个非常简单的正则表达式,然后使用代码验证它。

(20\d{2})(\d{2})(\d{2})

(查看demo

答案 1 :(得分:0)

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

(((\d{4})(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))|((\d{4})(0[469]|11)(0[1-9]|[12][0-9]|30))|((\d{4})(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 = "((\d{4})(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))"
    Dim meses30 As String = "((\d{4})(0[469]|11)(0[1-9]|[12][0-9]|30))"
    Dim febrero28 As String = "((\d{4})(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, ")")