我正在尝试使用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 (让我们假设没有闰年检查)
如何将此检查添加到我的表达式中?
答案 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;
更新
不要使用正则表达式来验证日期!这个问题是一个典型的无意义的作业,但我接受了挑战。
另请注意,此正则表达式不是您能想到的最佳表达式,但它清晰简单。
考虑到编译和解析时间,它比前面的快得多。