在文本文件中每行提取2次

时间:2009-08-31 22:27:42

标签: c# regex

我有一个包含许多行的测试文件,每行看起来像:

4:19 PM     5:15 PM  this is some text blah blah

我需要一个可以拉2次并将它们分配给变量的正则表达式。

所以基本上我将循环浏览一个文本文件,并从每一行中提取时间信息,并将两者之间的差异加起来。

我需要有关正则表达式的帮助。

2 个答案:

答案 0 :(得分:2)

试试这个:

 ^([0-9][0-9]*:[0-9][0-9]* (AM|PM))(\t| )+([0-9][0-9]*:[0-9][0-9]* (AM|PM))

数据在第1和第4场比赛中。

答案 1 :(得分:1)

这使用稍微调整的正则表达式,并添加日期之间的差异,如上所述:

string[] input = { "4:19 PM         5:15 PM  this is some text blah blah",
                   "3:00 PM         5:00 PM  text"
                 };

// build up pattern
string datePattern = @"(\d+:\d+\s(?:AM|PM))";
string pattern = String.Format("^{0}{1}{2}{3}$",
                               datePattern, @"\s+", datePattern, @"\s+.*");

TimeSpan total = new TimeSpan();
foreach (string text in input)
{
    var match = Regex.Match(text, pattern);
    if (match.Success)
    {
        // skip first group which has entire match
        DateTime dt1 = DateTime.Parse(match.Groups[1].Value);
        DateTime dt2 = DateTime.Parse(match.Groups[2].Value);
        TimeSpan diff = dt2 - dt1;
        total += diff;
    }
}
Console.WriteLine("Total difference: {0}", total);

结果:总差异:02:56:00


如果您确信数据格式正确,可以使正则表达式非常简单,如下所示:

    string text = "4:19 PM         5:15 PM  this is some text blah blah";
    string pattern = @"(?<time>\d+:\d+)\s(?<period>AM|PM)";

foreach(Match m in Regex.Matches(text, pattern))
{
    Console.WriteLine("Time: {0} - Period: {1}",
        m.Groups["time"].Value,
        m.Groups["period"].Value
        );
}

如果您不信任这些数据,那么您可能需要更强大的功能。