可匹配2022年05月27日 或2022年5月1日格式 ,区分闰年
var pattern = /^(?:(?!0000)[0-9]{4}年(?:(?:0?[1-9]|1[0-2])月(?:0?[1-9]|1[0-9]|2[0-8])日|(?:0?[13-9]|1[0-2])月((?:29|30)日)|(?:0?[13578]|1[02])月31日)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)\年0?2\月29日)$/
严格校验yyyy.MM.dd格式 ,区分闰年
^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}).(((0[13578]|1[02]).(0[1-9]|[12][0-9]|3[01]))|((0[469]|11).(0[1-9]|[12][0-9]|30))|(02.(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)).02.29)$
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main(String args[]) {
String str1 = "20220207";
String str2 = "U2018年01月0日";
String str3 = "2018/01/29";
String str4 = "2018-01-29";
String pattern1 = "^([\\d]{4}((((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][0-9])|30))|(02((0[1-9])|(1[0-9])|(2[0-8])))))|((((([02468][048])|([13579][26]))00)|([0-9]{2}(([02468][048])|([13579][26]))))(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][0-9])|30))|(02((0[1-9])|(1[0-9])|(2[0-9]))))){4})$";
String pattern2 = "^(?:(?!0000)[0-9]{4}年(?:(?:0?[1-9]|1[0-2])月(?:0?[1-9]|1[0-9]|2[0-8])日|(?:0?[13-9]|1[0-2])月((?:29|30)日)|(?:0?[13578]|1[02])月31日)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)\\年0?2\\月29日)$";
String pattern3 = "^(?:(?!0000)[0-9]{4}\\/(?:(?:0?[1-9]|1[0-2])\\/(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\\/(?:29|30)|(?:0?[13578]|1[02])\\/31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)\\/0?2\\/29)$";
String pattern4 = "^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$";
System.out.println("yyyyMMdd:" + Pattern.matches(pattern1,str1));
System.out.println("yyyy年MM月dd日:" + Pattern.matches(pattern2,str2));
System.out.println("yyyy/MM/dd:" + Pattern.matches(pattern3,str3));
System.out.println("yyyy-MM-dd:" + Pattern.matches(pattern4,str4));
}
}