2010-03-24 28 views
10

我的第一個問題和Im興奮...我已經潛伏自上線和愛的網站,但我道歉的任何新手錯誤,格式等...爲什麼此數據YYYY-MM-DD正則表達式在Java中失敗?

我試圖驗證格式在Java中包含日期的字符串字段。我們將在字符串中接收日期,我將在將其解析爲真正的Date對象之前驗證其格式。傳入的格式爲YYYY-MM-DD格式。但是我卡在我的測試之一,如果我通過在「1999-12-33」會導致測試失敗(因爲它應該具有的天數時33),與此不完整的模式:

((19|20)\\d{2})-([1-9]|0[1-9]|1[0-2])-([12][0-9]|3[01])

然而,由於一旦我添加以粗體顯示的字符下方通過測試(但是不應該)

((19|20)\\d{2})-([1-9]|0[1-9]|1[0-2])-(0[1-9]|[1-9]|[12][0-9]|3[01])

*額外的說明,我知道我可以改變0[1-9]|[1-9]0?[1-9],但我想打破一切下降到其最簡單的格式試圖找出爲什麼這不起作用。

這裏是廢的測試,我已經把通過所有的不同的日期場景運行:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class scrapTest { 
    public scrapTest() { 
    } 

    public static void main(String[] args) { 

     scrapTest a = new scrapTest(); 
     boolean flag = a.verfiyDateFormat("1999-12-33"); 
    } 

    private boolean verfiyDateFormat(String dateStr){ 
     Pattern datePattern = Pattern.compile("((19|20)\\d{2})-([1-9]|0[1-9]|1[0-2])-(0[1-9]|[1-9]|[12][0-9]|3[01])"); 
     Matcher dateMatcher = datePattern.matcher(dateStr); 
     if(!dateMatcher.find()){ 
      System.out.println("Invalid date format!!! -> " + dateStr); 
      return false; 
     } 
     System.out.println("Valid date format."); 
     return true; 
    } 
} 

我一直爲編程〜10年,但非常新的Java,所以請隨時解釋什麼像你認爲合適的那樣基本。

回答

8

我想這是因爲你使用dateMatcher.find()而非dateMatcher.matches()。前者尋找匹配,後者試圖匹配整個字符串。請參閱API page。因此,基本上33中的前3將匹配剛剛添加的[1-9],第二個3將不匹配任何東西,但該方法仍然返回true。

+0

感謝,這是它。匹配正確匹配整個模式。 – ProfessionalAmateur 2010-03-24 15:36:20

+0

沒問題,我的榮幸:) – miorel 2010-03-24 15:47:58

5

(0 [1-9] | [1-9] | [12] [0-9] | 3 [01])

第二種情況下,[1-9],看起來是部分成功,因爲您沒有測試字符串的結尾。

它匹配1999年12月3日,而不是1999-12-33

1

像Broam說,你的模式找到了日期的一部分進行匹配,匹配整個輸入字符串,使用:

if (!dateMatcher.matches()) { 

,而不是find()

2

不是一個真正的問題的答案,而是一個建議:寫一個簡單的正則表達式,然後做Java的數字驗證,而不是在你的正則表達式:

(\\d{4})-(\\d{2})-(\\d{2})

匹配這對你的輸入,提取相關組並轉換爲整數,然後檢查年,月和日部分以確保它們在可接受的範圍內。

3

如何使用SimpleDateFormat專爲此而設計?

 
Date d = new SimpleDateFormat("yyyy-MM-dd").parse(somestring); 
if (d == null) { 
    // somestring is not a Date 
} else { 
    // d is the Date 
} 

文檔爲 SimpleDateFormat

+0

奇怪的是這個:SimpleDateFormat format = new SimpleDateFormat(「yyyyMMdd」)匹配這個:「2015-06-10」 – 2016-01-07 20:37:25