解析 - 添加捕获组
Parsing - Adding a capturing group
我正在尝试使用一个相当复杂的 REGEX 表达式(请参阅下面的 REGEX101 演示),我对该站点上专家创建的表达式进行了轻微修改。它解析日志事件的特定模式:
- 1EXE_IN1EXE_CO2CONTENT_ACCESS3CONTENT_ACCESS
这些日志序列将始终以随机选择的 EXE_IN
或 EXE_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 函数).
非常感谢。
(\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)
我正在尝试使用一个相当复杂的 REGEX 表达式(请参阅下面的 REGEX101 演示),我对该站点上专家创建的表达式进行了轻微修改。它解析日志事件的特定模式:
- 1EXE_IN1EXE_CO2CONTENT_ACCESS3CONTENT_ACCESS
这些日志序列将始终以随机选择的 EXE_IN
或 EXE_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 函数).
非常感谢。
(\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)