首页 > 解决方案 > 正则表达式如何获取句子之间最后一个元素的时间

问题描述

例如
,我想得到最后同意时间的句子,如图片。

输入 :

Agree|AAA Agree 7/28 22:34,Agree|BBBB Agree 7/28 23:20,Agree|CCC Agree 7/29 07:41,Agree|JJJ Agree 7/29 07:45,Agree|DDD Agree 7/29 07:54,forward|EEE forward 7/29 07:54,forward|FFF forward 7/29 07:54,forward|GGG forward 7/29 07:54,forward|HHHH forward 7/29 07:54

预期输出:

7/29 07:54

image-20200729082045279

我试过使用 LINQ,但我只能像图片那样做。

void Main()
{
    var input = "Agree|AAA Agree 7/28 22:34,Agree|BBBB Agree 7/28 23:20,Agree|CCC Agree 7/29 07:41,Agree|JJJ Agree 7/29 07:45,Agree|DDD Agree 7/29 07:54,forward|EEE forward 7/29 07:54,forward|FFF forward 7/29 07:54,forward|GGG forward 7/29 07:54,forward|HHHH forward 7/29 07:54";
    var output = input.Split('|')
        .Where(_ => _.Contains("Agree")).Select((e, index) => new {e,index})
        .OrderByDescending(_=>_.index)
        .Take(1);
}

图像-20200729082008606

标签: c#regex

解决方案


这个正则表达式可以解决问题

Agree (\d{1,2}\/\d{1,2} \d{1,2}:\d{1,2})(?!.*Agree \d{1,2}\/\d{1,2} \d{1,2}:\d{1,2})

这意味着Agree \d{1,2}\/\d{1,2} \d{1,2}:\d{1,2}之后不会出现任何Agree \d{1,2}\/\d{1,2} \d{1,2}:\d{1,2}

然后你会这样做以提取7/29 07:54lastAgree变量中

string pattern = @"Agree (\d{1,2}\/\d{1,2} \d{1,2}:\d{1,2})(?!.*Agree \d{1,2}\/\d{1,2} \d{1,2}:\d{1,2})";           

// Get your match using pattern
var match = Regex.Match(text, pattern);

// Groups[1] is (\d{1,2}\/\d{1,2} \d{1,2}:\d{1,2})
var lastAgree = match.Groups[1].Value; 

推荐阅读