Java 使用regexp验证二月作为日期验证的一部分

Java 使用regexp验证二月作为日期验证的一部分,java,regex,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天是一个月 让我们假设没有闰年检查 如何将此支票添加到表达式中?格式为dd/mm/yyyy 这个正则表达式唯一的问题是,它将匹配每年2月29日 此正则表达

我正在尝试使用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天是一个月 让我们假设没有闰年检查

如何将此支票添加到表达式中?

格式为dd/mm/yyyy

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

此正则表达式包括:

(?:[12][0-9]|0?[1-9])/0?2
如果月份是二月,则此部分尝试匹配正确的日期和月份。2月1日至29日

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

(?: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}$
讨厌的正则表达式

    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;
更新

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

还要注意的是,这个正则表达式并不是你能想到的最好的,但是它是清晰而简单的


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

只是不要使用正则表达式。通过不使用不可维护的正则表达式,而不是写一些简单的代码。这是为了做家庭作业,我需要用regexp来做。你在做什么,使得java的内置日期解析不够好?只需使用Calendar classDays=00就可以了。我想你指的是28天而不是24天。此外,您还需要一组额外的paren to years,适用于所有月/日选项,而不仅仅是最后一个。修复了它。。。第二天早上。1999年5月9日不通过与2000年2月29日不匹配,{0,1}可以写?@M42没有闰年,但至少regexp很简单,我女儿可以添加29。我会使用[1-9][0-9]*作为年份-看不出任何理由我们应该将其限制在这之外这更好!请你给我解释一下好吗?我怎么能把它改成只接受2月份的28天,让我们假设闰年没有支票?谢谢!新问题:它没有遵循我期望的格式:dd/mm/yyyy,例如接受1/9/2014
    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;