正则表达式以匹配日期范围

时间:2009-09-22 14:22:58

标签: c# regex

有没有人对是否/如何创建正则表达式以匹配任何给定时期内的日期有任何想法?

两个例子:

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.

我一直在绞尽脑汁想知道如何提出一些事情,但我没有什么可以接近的。 Web上的示例仅对检查日期是否采用特定格式感兴趣,而不关心验证范围。

我在此标记C#的原因是,这不能在直接正则表达式中完成,并且需要为每个单独的案例手动构建范围正则表达式。

7 个答案:

答案 0 :(得分:16)

将字符串解析为DateTime并比较它们会不会更容易?

答案 1 :(得分:8)

我认为你不应该使用正则表达式进行范围检查。首先检查日期是否对正则表达式有效,然后检查它是否属于给定的时间段。

答案 2 :(得分:6)

... DONT

使用正则表达式提取日期,然后将其与范围进行比较。这将比创建一个匹配日期范围的正则表达式更容易......

这是着名的“......然后你有2个问题”的经典例子;)

答案 3 :(得分: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$

答案 4 :(得分:0)

据我所知,这是不可能的。 您可以尝试两步法:   - regexp查找日期并将其存储在日期对象中   - 测试找到的日期是否在您的范围内

答案 5 :(得分:0)

查看DateTime.ParseExact将字符串转换为日期,然后将它们用作常规DateTime范围。如果可能的话,正则表达式会很糟糕!!

答案 6 :(得分:-1)

表达式,不检查日期的正确性

01/09/1984 - 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$