yyyyMMdd的正则表达式日期验证

时间:2011-05-19 13:16:34

标签: java regex

我正在寻找一个正则表达式字符串,它将验证格式为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());
  }
}

3 个答案:

答案 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年不是闰年)

然后在最后一节中处理所有其他月份

(我没有真正测试过,但它应该足够接近)