用于匹配多种日期格式的正则表达式

时间:2010-05-08 12:38:18

标签: c# regex date tryparse

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

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-2009 26 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页面解析,因此我无法设置空格或分隔符。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

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

+ meta字符指定一个或多个,考虑对空格使用*(零或更多)。

修改

我的意思是,如果你的正则表达式是用空格/分隔符匹配日期,但是没有它们中的任何一个匹配日期,即26FEB2009,那么听起来你指的是空格/分隔符是强制性的比赛。

这是我很快被撞到的东西:

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

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

相关问题