2009-09-22 55 views
4

有沒有人有任何想法如何/如何創建一個正則表達式來匹配任何給定時期的日期?正則表達式匹配日期範圍

兩個例子:

23/11/2008 - 12/04/2010 

//The expression would evaluate whether 16/04/2010 was in this range, and return false. 
//The expression would determine whether 03/12/2009 was in this range, and return true. 

01/09/1984 - 30/04/2001 

//The expression would evaluate whether 16/04/1990 was in this range, and return true. 
//The expression would determine whether 03/12/2009 was in this range, and return false. 

我已經費盡瞭如何來的東西我的大腦,但我有沒有什麼接近。網絡上的示例只關心檢查日期是否處於特定格式,而不關心驗證範圍。

我在這裏標記C#的原因是,這不能用直的正則表達式來完成,而範圍正則表達式需要爲每個個案手動構建。

+5

不確定這種邏輯最適合正則表達式。將不得不涉及前瞻/ lookbehind條件和相當可怕的期待。另一方面,轉換爲紀元時間並在代碼中進行比較非常簡單。 – 2009-09-22 14:25:10

+0

@Devin:是的,我認爲情況會如此。並期待這一切都在正則表達式可能有點太多。 – 2009-09-22 14:27:54

+0

@丹 - 好思維。你不想陷入整個「如果我只有一把錘子,每個問題看起來像釘子」的東西。 – 2009-09-22 15:38:41

回答

16

將字符串解析爲DateTime並比較它們會更容易嗎?

+0

那麼,我正在研究爲每個範圍創建一次正則表達式,而不是每次都創建正則表達式。是的,這可能會更容易,我想... :) – 2009-09-22 14:28:42

8

我不認爲你應該使用正則表達式來進行範圍檢查。首先用正則表達式檢查日期是否有效,然後檢查它是否落在給定的時間段內。

6

DONT ...

使用正則表達式來提取日期,然後把它比VS的範圍內。這將是一個容易得多然後創建一個正則表達式匹配一個日期範圍...

這是著名的一個典型的例子「...然後你有2個問題」的報價;)

0

給我最好的知識無法做到這一點。 你可以嘗試2步的方法: - 正則表達式找到一個日期,並將其存儲在一個約會對象 - 測試,如果發現日期是在你的範圍

4

這將是可能的,但是這將是一個有點複雜編寫能夠動態生成正則表達式的代碼。

對於23/11/2008 - 12/04/2010範圍,您將首先將它分爲第一年,第二年和第三年之間的三個範圍。然後,你會將每年分成具有相同天數的月份。然後,將每個月份的日期範圍分成幾十個(例如01-09,10-19,20-28)。從您可以創建一個正則表達式,如:

^(2[3-9]|30)/11/2008| 
(0[1-9]|[12]\d|3[01])/12/2008| 
(0[1-9}|1\d|2[0-8])/02/2009| 
(0[1-9]|[12]\d|3[01])/(0[13578]|1[02])/2009| 
(0[1-9]|[12]\d|30)/(0[469]|11)/2009| 
(0[1-9}|1\d|2[0-8])/02/2010| 
(0[1-9]|[12]\d|3[01])/0[13]/2010| 
(0[1-9]|1[0-2])/04/2010$ 
0

看看DateTime.ParseExact把串入一個日期,然後把它們作爲普通的日期時間範圍。如果可能的話,正則表達式將會很糟糕!

-1

表情,不檢查日期的正確性

1984年1月9日 - 30/04/2001

^\d\d/(09|1[012])/1984| 
\d\d/\d\d/(198[5-9]|199\d|2000)| 
\d\d/0[1-3]/2001| 
(0[1-9]|[12]\d|30)/04/2001$ 

23/11/2008 - 12/04/2010

^(2[3-9]|30)/11/2008| 
\d\d/12/2008| 
\d\d/\d\d/2009| 
\d\d/0[1-3]/2010| 
(0[1-9]|1[0-2])/04/2010$ 
+0

這將匹配99/99/1985。您確保年份在正確的範圍內,並且月份在外部年份(1984年和2001年)的正確範圍內,但不檢查月份/日期是否在其他年份的正確範圍內。 – craig65535 2012-09-27 18:01:06