2014-01-14 37 views
4

我想匹配類型的日期:ddmmyyyy ,如:04072001 到目前爲止,我有這樣的:正則表達式匹配類型的日期:DDMMYYYY

^(?:(?:31(?:0?[13578]|1[02]))\1|(?:(?:29|30)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:290?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

幾乎是與here相同,但沒有分隔符((\/|-|\.)

+3

什麼不工作? – Bohemian

+0

那麼,爲什麼不從這個問題的答案中刪除'(\/| - | \。)'?什麼不行? –

+0

我無法匹配上面的例子(嘗試它在regexpal中,而在鏈接中的答案適用於dd/mm/yyyy,當我刪除(\/| - | \。)時,它仍然不匹配 – dimzak

回答

3

您可以使用如下更簡單的東西:

^(0[1-9]|[1-2][0-9]|31(?!(?:0[2469]|11))|30(?!02))(0[1-9]|1[0-2])([12]\d{3})$ 

它捕捉日期,月份,年份,並驗證一切,除了2月29日是否實際上是閏年。 (要做到這一點,我只需在捕獲的年份/日期之後執行數學計算,而不是試圖將其寫入表達式中)。

工作例如:http://regex101.com/r/dH8mG3

解釋:

- Capture the day: 01-29 
    - OR 31, if not succeeded by 02, 04, 06, 09, or 11 
    - OR 30, if not succeeded by 02 

- Capture the month: 01-12 
- Capture the year: 1000-2999 (you could narrow this down 
           by using number ranges like 
           (1[8-9]\d{2}|20\d{2}) == 1800-2099 
0

正則表達式是不是這個職位的最佳工具。

如果可能的話,只是比賽^\d{8}$(或^\d\d\d\d\d\d\d\d$如果你的正則表達式引擎不支持{8}語法)然後編程檢查日期是否有效。

在稍微詳細:

  1. 匹配^(\d\d)(\d\d)(\d\d\d\d)$(根據需要進行調整語法)。
  2. 提取三個匹配組並以編程方式檢查它們是否構成有效日期。

後者要求(一)明知天在每個月的數量,和(b)知道哪些年是閏年(這取決於你使用的日曆,公曆是顯而易見的選擇,但認爲大約在它被引入之前的幾年)。

由此產生的代碼將是更易於閱讀和維護。

(另外,如果你有過任何格式的控制,可考慮使用年月日,而不是DDMMYYYY;它按正確的,它是由ISO 8601標準中規定的格式之一。)

2

不驗證只使用日期正則表達式。您的語言可能有一個內置日期對象和自己的方法,您可以將其與您已使用RegEx進行驗證的格式的輸入結合使用。