有没有人对是否/如何创建正则表达式以匹配任何给定时期内的日期有任何想法?
两个例子:
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#的原因是,这不能在直接正则表达式中完成,并且需要为每个单独的案例手动构建范围正则表达式。
答案 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$