我正在寻找一个正则表达式字符串,它将验证格式为yyyyMMdd(无分隔符)的日期并适用于闰年。到目前为止,我发现的最接近的事情只是验证了自2000年以来的日期。
import java.util.regex.Pattern;
public class TestDate {
public static final Pattern datePattern = Pattern.compile("** Need RegEx **");
public static void main(String[] args) {
System.out.println(datePattern.matcher("19960229").matches());
}
}
答案 0 :(得分:8)
我建议使用this page中显示的java.text.DateFormat
:
public static boolean isValidDateStr(String date) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setLenient(false);
sdf.parse(date);
}
catch (ParseException e) {
return false;
}
catch (IllegalArgumentException e) {
return false;
}
return true;
}
答案 1 :(得分:2)
由于闰年需要复杂的计算,因此使用正则表达式几乎是不可能的。 Jon Skeet是对的:请使用new SimpleDateFormat("yyyyMMdd")
。
答案 2 :(得分:1)
闰年的正则表达式非常复杂:例如:(这也包含完整的日期检查)
"(((\\d\\d)(0[48]|[2468][048]|[13579][26])|([02468][048]|[13579][26])(00))(02)([012]\\d))|(\\d\\d([02468][1235679]|[13579][01345789])(02)([01]\\d|2[012345678]))|(\\d\\d\\d\\d((0[13578]|1[02])([012]\\d|3[01])|((0[46]|11)([012]\\d|30))))"
第一部分将一般情况与非结尾的00
分开第二部分处理世纪年,所以只有400年的可years年是闰年(1900年不是闰年)
然后在最后一节中处理所有其他月份
(我没有真正测试过,但它应该足够接近)