使用正则表达式验证二月作为日期验证的一部分

时间:2014-09-12 21:40:12

标签: java regex

我正在尝试使用regexp验证日期(它是regexp上的家庭作业 - 是的,我知道有更好的方法在Java中使用API​​执行此操作)

到目前为止,我管理了以下表达式:

(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/((18|19|20|21)\\d\\d)

我想在2月份添加一张支票,即当天不能有30和31是2 (让我们假设没有闰年检查)

如何将此检查添加到我的表达式中?

2 个答案:

答案 0 :(得分:2)

格式为 dd / mm / yyyy

^(?:(?:[12][0-9]|0?[1-9])/0?2|(?:30|[12][0-9]|0?[1-9])/(?:0?[469]|11)|(?:3[01]|[12][0-9]|0?[1-9])/(?:0?[13578]|1[02]))/[0-9]{4}$

这个正则表达式的唯一问题是,它将与每年2月29日相匹配。


此正则表达式包括:

(?:[12][0-9]|0?[1-9])/0?2

如果月份是2月份,此部分将尝试匹配正确的日期和月份。 (2月1日至29日)


如果月份不是2月,请尝试匹配:

(?:30|[12][0-9]|0?[1-9])/(?:0?[469]|11)

此部分尝试匹配每个有30天的月份。 (它是4,6,9和11个月)(从月的第1天到第30天)。


如果月份也不是4月,6月,9月或11月

(?:3[01]|[12][0-9]|0?[1-9])/(?:0?[13578]|1[02])

此部分尝试匹配月份(1,3,5,7,8,10和12)


最后一部分:[0-9]{4}与年份相匹配。 (每4位数字)


如果你希望正则表达式匹配到2月28日使用:

^(?:(?:1[0-9]|2[0-8]|0?[1-9])/0?2|(?:30|[12][0-9]|0?[1-9])/(?:0?[469]|11)|(?:3[01]|[12][0-9]|0?[1-9])/(?:0?[13578]|1[02]))/[0-9]{4}$

如果你希望正则表达式只匹配到2月28日dd / mm / yyyy所需的前导零(如果低于2位数):(你只需要将所有0?替换为0)

^(?:(?:1[0-9]|2[0-8]|0[1-9])/02|(?:30|[12][0-9]|0[1-9])/(?:0[469]|11)|(?:3[01]|[12][0-9]|0[1-9])/(?:0[13578]|1[02]))/[0-9]{4}$

答案 1 :(得分:0)

令人讨厌的正则表达式。

    String days30 = "(0{0,1}[1-9]|[12][0-9]|30)";
    String days31 = "(0{0,1}[1-9]|[12][0-9]|3[01])";
    String days28 = "(0{0,1}[1-9]|1[0-9]|2[0-8])";
    String month30 = "(0{0,1}(4|6|9)|11)";
    String month31 = "(0{0,1}(1|3|5|7|8)|1(0|2))";
    String years = "(17|18|19|20)\\d\\d";
    String dateExpr = "((" + days30 + "/" + month30 + ")|(" + days31 + "/" + month31 + ")|(" + days28 + "/02))/" + years;

更新

不要使用正则表达式来验证日期!这个问题是一个典型的无意义的作业,但我接受了挑战。

另请注意,此正则表达式不是您能想到的最佳表达式,但它清晰简单。

考虑到编译和解析时间,它比前面的快得多。