2015-03-02 152 views
0

我使用正則表達式如下java中以驗證日期:正則表達式日期驗證

"^(0?[1-9]|[12][0-9]|3[01])[-./](0?[1-9]|1[012])[-./]((19|20)\\d\\d)$" 

但它也採取了格式,如21-12.2014或21.12/2014爲有效日期。我知道這是因爲我在我的正則表達式中使用了[-./]。我怎樣才能避免這個問題?

+2

不要使用正則表達式? (例如,使用日期分析庫)。稍後更容易維護和理解。 – 2015-03-02 13:37:28

+0

同意@DaveNewton。不要爲此使用正則表達式。在捕捉到所有你需要的可能性之前,它將變得非常笨拙。如果你說「dd-MM-yyyy」,閱讀起來會容易得多。 – 2015-03-02 15:20:19

回答

2

這裏您需要使用反向引用。

"^(0?[1-9]|[12][0-9]|3[01])([-./])(0?[1-9]|1[012])\\2((19|20)\\d\\d)$" 

在上述正則表達式\\2是指存在所述組索引內部2.

注字符:不解析日期與正則表達式。

例子:

String s1 = "21-12-2014"; 
String s2 = "21-12/2014"; 
System.out.println(s1.matches("^(0?[1-9]|[12][0-9]|3[01])([-./])(0?[1-9]|1[012])\\2((19|20)\\d\\d)$")); 
System.out.println(s2.matches("^(0?[1-9]|[12][0-9]|3[01])([-./])(0?[1-9]|1[012])\\2((19|20)\\d\\d)$")); 

輸出:

true 
false 
0

不要使用正則表達式的。只是解析日期,因爲無論如何你顯然會這樣做。

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
Date d = sdf.parse(dateStr.replaceAll("[./]", "-")); 

趕上無效日期的異常。