【问题标题】:Parsing - Adding a capturing group解析 - 添加捕获组
【发布时间】:2019-02-20 00:40:30
【问题描述】:

我正在尝试使用一个相当复杂的 REGEX 表达式(请参阅下面的 REGEX101 演示),我根据本网站专家创建的一个稍微修改了它。它解析日志事件的特定模式:

  • 1EXE_IN1EXE_CO2CONTENT_ACCESS3CONTENT_ACCESS

这些日志序列将始终以随机选择的EXE_INEXE_CO 事件开头,前面是序列号。这些选择可以是任意数量、任意顺序。在这种情况下,我们只有两个 EXE 事件,但这可能是 200。或者 1。注意有一个序列号,我们需要捕获它。

序列的第二部分始终是一系列以数字开头的CONTENT.ACCESS 事件。再次从 1 到无穷大。

以下演示显示了一个工作示例,并且可能比我更好地传达了这个概念:Demo 1

它很好地捕获了不同组中的完整匹配、序列号和事件。

我需要在模式中添加一个时间戳(在序列号之后,前面有下划线),然后解析这个事件日志,例如

  • 1_11/08/2014 23:03EXE_IN1_11/08/2014 23:03EXE_CO2_12/08/2014 09:17CONTENT_ACCESS3_13/08/2014 09:17CONTENT_ACCESS

我还需要捕获时间戳。

我尝试调整正则表达式,结果好坏参半。请看这个演示:demo2

理想情况下,我希望在每个事件中都看到类似的内容:

Match n
Full match  266-308 `2_12/08/2014 09:17CONTENT_ACCESS`
Group 1. 266-267    `2`
Group 2. 268-284    `12/08/2014 09:17`
Group 3. 284-308    `CONTENT_ACCESS`

我希望你能帮助我。 REGEX101 pcre 测试就足够了(作为记录,我在 R 中使用了与 perl 兼容的 str_match_all_perl 函数)

提前非常感谢。

【问题讨论】:

  • 嗨@UnbearableLightness,感谢您的编辑。如果您遇到解决方案,请告诉我。干杯...

标签: r regex pcre capturing-group


【解决方案1】:

(\d+)_(.*?)(EXE_CO|EXE_IN|CONTENT_ACCESS)

https://regex101.com/r/EHHcKm/1

由于 cmets 更改为 (?:\G(?!^)(?(?=\d+_\d{2}\/\d{2}\/\d{4}\s\d{2}\:\d{2}(?:EXE_CO|EXE_IN))(?<!\d_\d{2}\/\d{2}\/\d{4}\s\d{2}\:\d{2}CONTENT_ACCESS))|(?=(?:\d+_\d{2}\/\d{2}\/\d{4}\s\d{2}\:\d{2}(?:EXE_CO|EXE_IN))+(?:\d+_\d{2}\/\d{2}\/\d{4}\s\d{2}\:\d{2}CONTENT_ACCESS)+))(\d+)_(\d{2}\/\d{2}\/\d{4}\s\d{2}\:\d{2})(EXE_CO|EXE_IN|CONTENT_ACCESS)

https://regex101.com/r/EHHcKm/3

还有另一个版本,更短 (?:\G(?!^)(?(?=\d+_.{16}(?:EXE_CO|EXE_IN))(?<!\d_.{16}CONTENT_ACCESS))|(?=(?:\d+_.{16}(?:EXE_CO|EXE_IN))+(?:\d+_.{16}CONTENT_ACCESS)+))(\d+)_(.{16})(EXE_CO|EXE_IN|CONTENT_ACCESS)

https://regex101.com/r/EHHcKm/4

还有更短的(?:\G(?!^)(?(?=\d+_.{16}E)(?<!S))|(?=(?:\d+_.{16}(?:EXE_CO|EXE_IN))+\d+_.{16}C))(\d+)_(.{16})(EXE_CO|EXE_IN|CONTENT_ACCESS)

https://regex101.com/r/EHHcKm/5

还有超短(?:\G|(?=\d+_.{16}E.*CON))(\d+)_(.*?)(EXE_CO|EXE_IN|CONTENT_ACCESS)

https://regex101.com/r/EHHcKm/8

【讨论】:

  • 您好,感谢您的回复。我意识到我在这里可能没有明确,但字符串由两部分组成。第一部分必须以 EXE_CO 事件或 EXE_IN 事件或这些事件的随机选择开始。第二部分必须存在并且可以是 CONTENT_ACCESS 事件的一个或多个实例。我正在寻找的正是这个分组。
  • 所以在这个例子中... 1_11/08/2014 23:03EXE_IN1_11/08/2014 23:03EXE_CO2_12/08/2014 09:17CONTENT_ACCESS3_13/08/2014 09:17CONTENT_ACCESS 我们只能有 EXE左边和右边的 CONTENT_ACCESS。它们必须在一起,但不能混淆。如果您需要更多说明,请告诉我。
  • 据我了解,您需要这样的东西 (?(?<=S)(\d+)_(.{16})(CONTENT_ACCESS)|(?(?<=O|N)(\d+)_(.{16})(EXE_CO|EXE_IN|CONTENT_ACCESS)|(\d+)_(.{16})(EXE_CO|EXE_IN))) regex101.com/r/EHHcKm/2 。但我强烈不建议您这样做,在 R 中分析所有内容比尝试在 Regex 中进行分析要容易得多
  • 您好,与时间戳捕获的良好通话。这是比我的更好和更简单的捕获。您的答案更接近,但这些团体并没有很清楚地捕捉到。我仍然非常感谢你的努力。我只是想知道您是否可以在此处修改示例:link。这有效,但没有时间戳。或者一些关于 R 代码的指导可能会有所帮助。对不起,如果我要求太多了。
  • @Funtboy 我已经更新了答案。我仍然不明白你想如何处理3CONTENT_ACCESS1EXE_IN2EXE_CO3CONTENT_ACCESS,但我已经完成了,就像它在你的链接中一样。还优化了超短版,应该会快很多。
猜你喜欢
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多