解析 - 添加捕获组

Parsing - Adding a capturing group

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

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

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

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

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

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

我还需要捕获时间戳。

我尝试调整正则表达式,结果好坏参半。请看这个演示: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 函数).

非常感谢。

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

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

由于评论已更改为 (?:\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