从Datetime解析额外的字符

J. *_*son 5 .net c# regex

嗨,我有以下代码从文件中读取日期.

using (var reader = new StreamReader(@"C:\myfile.txt")) 
{
    bool found= false;
    while (!reader.EndOfStream) 
  {
        var line = reader.ReadLine().Trim();

        if (found && line.EndsWith("Test")) 
        {
            var fordDate = DateTime.Parse(line.Substring(0, 19));
            Console.WriteLine("Test Date: {0}", fordDate);
            break;
        }
   }
 }
Run Code Online (Sandbox Code Playgroud)

问题是,当日期与其他文本相关联时,它会出错.例如

\r\n2013-03-03 12:22:02 
Run Code Online (Sandbox Code Playgroud)

我正在尝试更改它,以便代码可以从中删除"\ r \n"或任何其他文本,只是获取日期部分.

Rob*_*nik 3

你应该使用正则表达式

如果您的日期始终采用相同的格式,您可以轻松编写一个正则表达式,该表达式将从各行中提取日期并删除每一侧的其他任何内容。为了理解正则表达式应该如下所示:

\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}
Run Code Online (Sandbox Code Playgroud)

此正则表达式过于简化,并且允许类似0000-00-00 99:99:99可能无效的日期。这取决于您的文件是否可以保存某些可能显示为日期但实际上并非日期的值。更复杂(但更有效)的表达式是(假设 date 是YYYY-MM-DD且不是YYYY-DD-MM):

[12]\d{3}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])\s(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)
Run Code Online (Sandbox Code Playgroud)

该选项允许日期从 1000 年到 2999 年,正确的月份数字为 01-12,天数为 01-31,小时数为 00:00:00 到 23:59:59。

但为了使这个正则表达式更有用,我将它放在括号中并为其命名,以便这些日期将成为date代码中命名捕获组 ( ) 的一部分,您可以使用其名称而不是索引进行访问。

Regex rx = "(?<date>[12]\d{3}-(?:0\d|1[0-2])-(?:0[1-9]|[12]\d|3[01])\s(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)).*Test$";
if (rx.Text(line))
{
    Match m = rx.Match(line);
    // no need to use TryParse as regex assures correct formatting
    fordDate = DateTime.Parse(m.Groups["date"]);
}
Run Code Online (Sandbox Code Playgroud)

因此,我没有手动检查该行以 结尾,而是Test在正则表达式中包含了相同的要求。