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爲有效日期。我知道這是因爲我在我的正則表達式中使用了[-./]
。我怎樣才能避免這個問題?
我使用正則表達式如下java中以驗證日期:正則表達式日期驗證
"^(0?[1-9]|[12][0-9]|3[01])[-./](0?[1-9]|1[012])[-./]((19|20)\\d\\d)$"
但它也採取了格式,如21-12.2014或21.12/2014爲有效日期。我知道這是因爲我在我的正則表達式中使用了[-./]
。我怎樣才能避免這個問題?
這裏您需要使用反向引用。
"^(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
不要使用正則表達式的。只是解析日期,因爲無論如何你顯然會這樣做。
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
Date d = sdf.parse(dateStr.replaceAll("[./]", "-"));
趕上無效日期的異常。
不要使用正則表達式? (例如,使用日期分析庫)。稍後更容易維護和理解。 – 2015-03-02 13:37:28
同意@DaveNewton。不要爲此使用正則表達式。在捕捉到所有你需要的可能性之前,它將變得非常笨拙。如果你說「dd-MM-yyyy」,閱讀起來會容易得多。 – 2015-03-02 15:20:19