如何使用C#正则表达式匹配各种日期格式并获取日,月和年?

时间:2015-01-22 12:03:27

标签: 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。

3 个答案:

答案 0 :(得分:6)

我对正则表达式一无所知,但DateTime.TryParseExact有一个overload,它将格式作为字符串数组。

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

顺便说一下,mm specifier是几分钟,MM specifier是几个月,如果你试着提及几个月。

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
}

答案 1 :(得分:2)

行。我把问题分成了两个

  • 识别字符串中的日期模式并提取匹配的字符串
  • 验证已识别的日期模式,然后提取日,月和年。

我使用正则表达式来识别模式如下,然后使用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");
    }
}

答案 2 :(得分:0)

这是有效的:

        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);