Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式匹配yyyymmdd中的日期格式_Regex_Date_Nsregularexpression_Leap Year - Fatal编程技术网

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

Regex 使用正则表达式匹配yyyymmdd中的日期格式,regex,date,nsregularexpression,leap-year,Regex,Date,Nsregularexpression,Leap Year,正则表达式应与格式为yyyyymmdd的字符串中的有效日期匹配。例如,aaa_20150327_bbb应该匹配,但aaa_20150229_bbb不是因为2015年不是闰年 只需考虑2000年至2099年。完全疯狂(0-9999年) 下面的一个(基于答案)可以在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)))|(?:

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

只需考虑2000年至2099年。

完全疯狂(0-9999年) 下面的一个(基于答案)可以在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)
(检查)

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

(((\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(我认为更容易理解)


如果正则表达式不是闰年,就不可能排除
2/29
。至少不是理智的。你必须在事后分析清楚。
\d{8}
有问题吗?或者至少
20\d{2}[01]\d[0123]\d
?@JoeWang您使用的是什么语言?C++具有内置的功能,而不需要使用ReGeXAH…我们如何才能做到这一点。。。只需花5分钟研究re是什么,就可以排除这种可能性。这对于RegEx来说不是一个合适的问题。幸运的是,有很好的处理日期的库。提取字符串,然后使用日期解析库将其作为日期使用。查看:+了解“正常”方式!我很想在regex中执行一个健全性测试,然后(在需要的时候)使用不同的方法来导航和日历古怪。为什么不
(20\d{6})
来查看最后一个呢?@IanS为什么不呢?因为我需要三个单独的捕获组,以便在创建日期对象时可以使用年、月和日的单独匹配。示例:
新日期(匹配[1],匹配[2]-1,匹配[3])
(20\d{2})(\d{2})(\d{2})
(((\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))
    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, ")")