首页 > 解决方案 > 你如何匹配多行上的重复值?

问题描述

我正在尝试将多行与重复值匹配。如果有多个匹配项,我的脚本将继续。我一直在浏览反向引用文档,但我似乎无法根据我的情况进行处理。

这个想法是查询包含时间戳和操作的日志文件。我想将日志文件中包含重复时间戳的任何行与该行中包含的“开始”字符串进行匹配。

使用这种模式:

^(\b\d+)-(\d{2})-(\d{2}) (\d+):(\d{2})(?=\b[\s\S]*Starting\b)(?=[\s\S]*\b\1\b)

我希望匹配前两行,仅仅是因为时间戳完全相同。

2019-10-31 05:49:52.416 +10:00 [1] - Starting
2019-10-31 05:49:53.416 +10:00 [1] - Starting
2019-10-31 06:53:58.416 +10:00 [1] - Starting

目前,它只捕获第一行(1 个匹配项)。如何让它匹配多行上的重复值?

编辑:

为了澄清起见,我的模式正在寻找 YYYY-MM-DD HH:MM 的重复值。

标签: regexpcre

解决方案


您可以通过捕获您认为在以下所有行中相同的时间戳部分来使用反向引用Starting,您还可以在第二个捕获组中捕获该部分。

然后,您可以重复匹配以与第 1 组相同的值开头并在该行中包含第 2 组的所有行。

^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}).*(\bStarting\b)(?:\R\1.+\2)+
  • ^线路开始
  • (捕获组 1
    • \d{4}-\d{2}-\d{2} \d{2}:\d{2}匹配您要捕获的时间戳格式
  • )关闭组
  • .+匹配除换行符以外的任何字符 1 次以上
  • (捕获组 2
    • \bStarting\b在单词边界之间匹配开始
  • )关闭组
  • (?:非捕获组
    • \R\1.+\2匹配 Unicode 换行序列,对第 1 组中捕获的内容的反向引用,除换行符之外的任何字符的 1+ 倍,以及对第 2 组中捕获的内容的反向引用
  • )+关闭非捕获组并重复 1 次以上以匹配至少 2 行

正则表达式演示


推荐阅读