4

匹配任何格式的日期的正则表达式应该是什么,例如:

26FEB2009
31DEC2009

27 Mar 2008
30 Jul 2009

26-Feb-2009
27-Aug-2009

29/05/2008

07.11.2008

Jan 11 2008
May 26 2008

那应该是什么正则表达式?

我的正则表达式与 26-Feb-200926 FEB 2009匹配但不与26FEB2009 匹配。因此,如果有人知道,请更新它。

(?:^|[^\d\w:])(?'day'\d{1,2})(?:-?st\s+|-?th\s+|-?rd\s+|-?nd\s+|-|\s+)(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*(?:\s*,?\s*|-)(?:'?(?'year'\d{2})|(?'year'\d{4}))(?=$|[^\d\w])

日期 26FEB2009 是其他字符串的子字符串,如FUTIDX 26FEB2009 NIFTY 0并从 html 页面解析,因此我无法设置空格或分隔符。

4

2 回答 2

4

我建议您不要使用正则表达式来解析日期,甚至强烈反对使用正则表达式来解析 HTML。对于解析日期,您可以查看TryParseExact方法,对于解析 HTML,可以使用 DOM 解析器,例如Html Agility Pack

var dateStr = "26FEB2009";
var formats = new[] 
{ 
    "ddMMMyyyy", "dd MMM yyyy", "dd/MM/yyyy"
};
DateTime date;
if (DateTime.TryParseExact(
    dateStr, 
    formats, 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.NoCurrentDateDefault, 
    out date))
{
    // You have a match, use the date object
}
于 2010-05-10T06:08:46.593 回答
1

如果它匹配 2009 年 2 月 26 日而不是 2009 年 2 月 26 日,听起来您需要在每个日期段之间设置空格和分隔符(“-”和“/”)可选。

+ 元字符指定一个或多个,考虑使用 *(零个或多个)作为空格。

编辑

我的意思是,如果您的正则表达式匹配带有空格/分隔符的日期,但不匹配没有其中任何一个的日期,即 26FEB2009,那么听起来您指定空格/分隔符对于匹配是强制性的.

这是我快速拼凑的东西:

(\d{1,2})(\/|-|\s*)?((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)|\d{2})(\/|-|\s*)?(\d{4})

您可能想检查它是否缺少您想要的某些功能,但它与您的所有示例匹配。

于 2010-05-08T12:47:52.197 回答