C# 在C中使用正则表达式解析多个日期格式#

C# 在C中使用正则表达式解析多个日期格式#,c#,regex,datetime,C#,Regex,Datetime,使用C#4.5,我需要能够接受多种字符串格式的日期,并且需要能够将它们全部解析为有效日期。例子包括: 04-2014 April, 2014 April,2014 我已经想出了下面的代码,它允许我配置一个字典,其中包含所有可能的格式,以及它们的代表性RegEx格式和.NET等效的DateTime.ParseExact。这个解决方案有效。。。但是,有很多foreach和if块,我只想知道是否有更优雅/干净/更快的解决方案 DateTime actualDate; var dateFormats

使用C#4.5,我需要能够接受多种字符串格式的日期,并且需要能够将它们全部解析为有效日期。例子包括:

04-2014
April, 2014
April,2014
我已经想出了下面的代码,它允许我配置一个字典,其中包含所有可能的格式,以及它们的代表性RegEx格式和.NET等效的
DateTime.ParseExact
。这个解决方案有效。。。但是,有很多
foreach
if
块,我只想知道是否有更优雅/干净/更快的解决方案

DateTime actualDate;
var dateFormats = new Dictionary<string, string> { { @"\d{2}-\d{4}", "MM-yyyy" }, { @"(\w)+,\s\d{4}", "MMMM, yyyy" }, { @"(\w)+,\d{4}", "MMMM,yyyy" } };
var dateValues = new[] { "04-2014", "April, 2014", "April,2014", "Invalid Date" };
var successfulDateParse = false;
foreach (var dateValue in dateValues)
{
    foreach (var dateFormat in dateFormats)
    {
        var regex = new Regex(dateFormat.Key);
        var match = regex.Match(dateValue);
        if (match.Success)
        {
            actualDate = DateTime.ParseExact(match.Value, dateFormat.Value, CultureInfo.InvariantCulture);
            successfulDateParse = true;
            break;
        }
    }
    if (!successfulDateParse)
    {
        // Handle where the dateValue can't be parsed
    }
    // Do something with actualDate
}
DateTime实际日期;
var dateFormats=新字典{{{@“\d{2}-\d{4}”、“MM yyyy”}、{@“(\w)+、\s\d{4}”、“MM,yyyy”}、{@“(\w)+、\d{4}”、“MM,yyyy};
var dateValues=new[]{“04-2014”、“2014年4月”、“2014年4月”、“无效日期”};
var successfulDateParse=false;
foreach(dateValues中的变量dateValue)
{
foreach(dateFormats中的var dateFormat)
{
var regex=new regex(dateFormat.Key);
var match=regex.match(日期值);
如果(匹配成功)
{
actualDate=DateTime.ParseExact(match.Value、dateFormat.Value、CultureInfo.InvariantCulture);
successfulDateParse=true;
打破
}
}
如果(!successfulDateParse)
{
//无法分析dateValue的句柄
}
//用实际日期做点什么
}

欢迎您的任何意见

您不需要正则表达式。您可以使用
DateTime.TryParseExact

var dateValues = new[] { "04-2014", "April, 2014", "April,2014", "Invalid Date" };
var formats = new[] { "MM-yyyy","MMMM, yyyy","MMMM,yyyy" };

foreach (var s in dateValues)
{
    DateTime dt;
    if (DateTime.TryParseExact(s, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt) == false)
    {
        Console.WriteLine("Can not parse {0}", s);
    }
}

旁注:2014-05-07?还是2014-07-05?猜测日期时间格式的随机数有时看起来非常可靠:)Alexei,谢谢你的警告。我知道这个事实,我们需要处理输入值的问题。这就是我一直在寻找的。谢谢你EZI帮我找到了这个方法。