如何使用C#regex匹配各种日期格式并获得日期、月份和年份?

如何使用C#regex匹配各种日期格式并获得日期、月份和年份?,c#,regex,datetime,C#,Regex,Datetime,下面列出了已知的格式 dd/mm/yyyy (01/01/2015) d/m/yyyy (1/1/2015) dd/mm/yy (01/01/15) d/m/yy (1/1/15) 其他变体将使用破折号(-)、点(.)或空格作为字段分隔符 我正在考虑为每个模式创建一个正则表达式以保持其可维护性,但不确定是否有更好的解决方案。如果有更好的解决方案,请分享 更新: 日期是大文本的一部分,在从文本中提取可能的日期列表之前,我不能使用DateTime.TryParseExact。我不了解正则表达式,但

下面列出了已知的格式

dd/mm/yyyy (01/01/2015)
d/m/yyyy (1/1/2015)
dd/mm/yy (01/01/15)
d/m/yy (1/1/15)
其他变体将使用破折号(-)、点(.)或空格作为字段分隔符

我正在考虑为每个模式创建一个正则表达式以保持其可维护性,但不确定是否有更好的解决方案。如果有更好的解决方案,请分享

更新:
日期是大文本的一部分,在从文本中提取可能的日期列表之前,我不能使用DateTime.TryParseExact。

我不了解正则表达式,但,
DateTime。TryParseExact
具有一个将格式作为字符串数组的数组

您可以轻松地提供所有格式,并尝试您的字符串是否匹配其中一种格式

顺便说一下,是几分钟,是几个月,如果你试着提到几个月

string s = "";
var formats = new string[]
{
             "dd/MM/yyyy",
             "d/M/yyyy",
             "dd/mm/yy",
             "d/m/yy",

             "dd-MM-yyyy",
             "d-M-yyyy",
             "dd-MM-yy",
             "d-M-yy",

             "dd.MM.yyyy",
             "d.M.yyyy",
             "dd.MM.yy",
             "d.M.yy",

             "dd MM yyyy",
             "d M yyyy",
             "dd MM yy",
             "d M yy",
};
DateTime dt;
if (DateTime.TryParseExact(s, formats, CultureInfo.InvariantCulture,
                              DateTimeStyles.None, out dt))
{
    // Your string is matched one of first successfull match
}

嗯。我把这个问题一分为二

  • 识别字符串中的日期模式并提取匹配的字符串
  • 验证已识别的日期模式,然后提取日期、月份和年份
我使用regex来识别如下模式,然后使用DateTime.TryParseExact来验证和提取Soner建议的日、月和年

var datePatternRegex = new Regex(@"\b\d{1,2}(/|-|.|\s)\d{1,2}(/|-|.|\s)(\d{4}|\d{2})");
var testData = new []{
"This is test1 10/10/1012 data",
"This is test2 1/1/1012 data",
"This is test3 10-10-1012 data",
"This is test4 1-1-1012 data",
"This is test5 10.10.1012 data",
"This is test6 1.1.1012 data",
"This is test7 10 10 1012 data",
"This is test8 1 1 1012 data",
};

foreach(var data in testData)
{
    Console.WriteLine("Parsing {0}", data);

    var match = datePatternRegex.Match(data);
    if(match.Success)
    {
        var result = match.Groups[0];
        Console.WriteLine(result.Value);
    }
    else
    {
        Console.WriteLine("No Match");
    }
}
这是有效的:

        string input = "01/01/2015";
        Regex regex = new Regex(@"(?<day>(3[0-1]|[0-2]\d|\d))/(?<month>(1[0-2]|0\d|\d))/(?<year>([1-2]\d{3}|\d{2}))");
        Match match = regex.Match(input);

        string year = match.Groups["year"].Value;
        string month = match.Groups["month"].Value;
        string day = match.Groups["day"].Value;

        Trace.WriteLine(match.Groups["year"].Value);
        Trace.WriteLine(match.Groups["month"].Value);
        Trace.WriteLine(match.Groups["day"].Value);
string input=“01/01/2015”;
正则表达式Regex=newregex(@“(?(3[0-1]|[0-2]\d |\d))/(?(1[0-2]|0\d |\d))/(?([1-2]\d{3}\d{2}));
匹配=正则表达式匹配(输入);
字符串year=match.Groups[“year”].Value;
字符串month=match.Groups[“month”].Value;
字符串day=match.Groups[“day”].Value;
Trace.WriteLine(match.Groups[“year”].Value);
Trace.WriteLine(匹配.Groups[“月”].Value);
Trace.WriteLine(match.Groups[“day”].Value);

我建议您尝试使用regex-hero:您使用的是MVC Razor?在html5中可能有重复的输入类型datetime可用。。它可以处理所有可能的日期格式Hanks Soner。但这不符合我的要求,因为日期将是一个大文本的一部分,在使用TryParseExact方法之前,我需要先确定可能的日期列表。@Mani您没有机会拆分这个大字符串以获得这些值吗?没有,因为日期可以出现在我正在分析的字符串中的任何位置。这就是为什么我想用正则表达式来匹配各种日期模式。