代码之家  ›  专栏  ›  技术社区  ›  Wei Lin

正则表达式如何获取句子之间最后一个元素的时间

  •  0
  • Wei Lin  · 技术社区  · 4 年前

    例如
    我想把下面的句子最后同意的时间像图片一样。

    输入:

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

    image-20200729082008606

    0 回复  |  直到 4 年前
        1
  •  1
  •   Claudio Redi    4 年前

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

    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} 没有发生任何 同意\d{1,2}\/\d{1.2}\d{1,2}:\d{1,2}

    然后你会这样做来提取 7/29 07:54 进入之内 lastAgree 变量

    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;