2015-12-11 127 views
1

我想匹配13/12/2015的(日,月,年獨立):正則表達式解析日期 - 使正則表達式更貪婪

ASTA n° 30 | 13/12/2015 ore 10.00 | Arte Moderna & Contemporanea 

有了這個正則表達式(PHP - 的preg_match):

/(\d{1,2})\D{1,4}(\d{1,2})\D{1,4}(\d{4}|\d{2})/imu 

我:

30 | 13/12 

但我需要13/12/2015。 似乎正則表達式不夠貪婪......我知道我得到的匹配可能與我的正則表達式有關,但是我想在\ d {2}(在上一個圓括號中)選擇\ d {4}。

編輯:我需要\ d {2}和\ D {1,4}部分更靈活(有日期像13.10.15或13日12.2015等)。 有沒有辦法扭轉正則表達式引擎的處理順序(從頭到尾)?所以它會首先匹配\ d {4}然後\ d {2}(月和日)?

+0

一般方法是使用正則表達式提取日期,而不檢查日期是否有效,然後使用正確的方法驗證它,它更可靠,尤其是正則表達式不會檢查許多方面29.02:P – mikus

+0

是的,我知道;) 我檢查40種不同語言,30種不同的放置模式(如2015-20-10,2015年12月2日,2.3。和4.九月2015等) 我的規則嘗試提取一個日期,然後通過解析DateTime類進行驗證... – mfuesslin

回答

1

爲什麼不簡單地這樣:\d{2}\/\d{2}\/\d{4}(點擊演示的正則表達式)。

你必須數字,斜線,兩位數字,再次斜槓和4位數字。

如果你想添加對單個數字和例如連字符的支持,你可以這樣做:\d{1,2}[\/-]\d{1,2}[\/-]\d{4}(同樣,點擊regex進行演示)。

更新爲每個操作的要求,也符合兩位數的年份:

(\d{1,2}[\/-]\d{1,2}[\/-](?:\d{4}|\d{2}))DEMO

此正則表達式增加了一個檢查,如果它不能找到一個4位數的年會顯得只有2位。

編輯2:我縮短了一點正則表達式 - 現在日期和月份在相同的正則表達式非捕獲組中,但只有在此正則表達式出現兩次時才匹配。無需進一步費周折,正則表達式:

((?:\d{1,2}[\/-]){2}(?:\d{4}|\d{2}))DEMO

+0

有時會有一個年份只有兩個數字......這也應該匹配。 ..例如13.10.15 ...但如果有一個4位數的年份,應該優先選擇這種情況。 – mfuesslin

+0

@mfuesslin我已經更新了我的答案,以匹配兩位數的年份。如果它回答你的問題,記得標記一個被接受的答案。 – Asunez

+0

你的方法很好!有沒有辦法用\ D而不是字符類[\/- ]來做到這一點?我已經接受了你的答案,因爲它符合我的要求(但是我仍然必須探索我必須在角色類中加入以匹配所有日期變體)。\ D的東西只是爲了更大的靈活性,因爲我無法通過250000個日期來獲得角色類所需的所有字符(「日期分隔符」) – mfuesslin

0

使用

(\ d {1,2})\ /(\ d {1,2})\ /(\ d {4} | \ d {2})

+0

\ D匹配任何非數字,這是造成問題 – nkit

+0

爲什麼1-4斜槓? – Asunez

+0

對不起,這是一個複製粘貼錯誤。謝謝@Asunez – nkit