2011-05-19 184 views
2

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

你真的*有*使用正则表达式?一个绝对准确的将非常复杂,而不仅仅是使用日期解析器。 – 2011-05-19 13:18:32

回答

8

我建议使用java.text.DateFormat如图this page

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; 
    } 
2

我的东西使用正则表达式这几乎是不可能的,因闰年所需的复杂计算。乔恩Skeet是正确的:使用new SimpleDateFormat("yyyyMMdd")为此。

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[]))|(\\d\\d\\d\\d((0[13578]|1[02])([012]\\d|3[01])|((0[46]|11)([012]\\d|30))))" 

首节00

在一般的情况下分离出非结局第二部分处理的世纪年份所以只有通过多年的400 divisable是闰年(1900是不是闰年)

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

(我真的不考这个,但它应该工作足够接近)