2013-08-05 53 views
3

您好,感謝您的幫助。我有一個在給定的字符串中找到日期的正則表達式,它似乎沒有工作。有人能告訴我我做錯了什麼嗎?該代碼都像用於查找字符串中日期的正則表達式

Pattern pattern = Pattern.compile("^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d(?:,)$"); 
Matcher match = pattern.matcher(text1); 

List<String> removable1 = new ArrayList<String>();    
while(match.find()) { 
    removable1.add(match.group()); 
} 

我知道有個約會「2013年7月2日」包含在沒有被寫入列表removable1字符串的text1。提前感謝任何幫助。

回答

2

您的模式不允許使用一位數的日期和月份。取得領先0可選:

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

而且,我不知道後面的逗號做什麼。此外,你說「包含在字符串中」,但^$將模式錨定到開始和結束。所以,你可能想刪除這些,如果你想找到日期:

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

最後,如果你想確保兩個日期分隔符相同的字符,你可以這樣做:

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

最後,對於一些優化,避免捕獲,你不需要它(並有可能使世紀可選:

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

非常感謝你的工作。 – newtoprogramming

+0

您好,一個簡單的問題。假設日期被前後兩個字符串包圍,我想匹配那些特定字符串之間的正則表達式模式,這個工作[^ string1 string2(0?[1-9] | [12] [0-9] | 3 [01])([ - /.])(0?[1-9]|1[012])\\2(19|20)\\d\\d string3 string4 $] – newtoprogramming

+0

@ newtoprogramming yes it應該(只要那些方括號不是你的模式的一部分)。你爲什麼不試試呢? –

1

試試這個

String text1="07/02/2013"; 
Pattern pattern = Pattern.compile("^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d$"); 
+3

你確定改變輸入是一個有效的解決方案嗎? ^^我認爲這是關於匹配給定的輸入,而不是找到與模式匹配的輸入。 –

1

您使用的正則表達式不正確。任務部分匹配一天爲例

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

這個正則表示0應該用作前綴如果天是1〜9。

要解決此問題,您應該添加?這意味着前面的項目是可選的。所以,你可以在你的正則表達式的字符串更改爲

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

在未來,你可以使用正則表達式測試儀調試這些問題。它們很有用,有助於節省時間。例如, http://regex.uttool.com,http://regexpal.com/

+0

對於Java問題,OP應該使用http://regexplanet.com。我不知道regex.uttool.com,但regexpal使用JavaScript的正則表達式。 –

+0

這兩個都使用javascript正則表達式。 –

相關問題