解析-添加捕获组

时间:2018-09-15 12:51:35

标签: r regex pcre capturing-group

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

  • 1 EXE_IN 1 EXE_CO 2 CONTENT_ACCESS 3 CONTENT_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函数)

非常感谢。

1 个答案:

答案 0 :(得分:1)

RecyclerView

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

由于评论已更改为(\d+)_(.*?)(EXE_CO|EXE_IN|CONTENT_ACCESS)

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

还有另一个版本,较短 (?:\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/4

更短的(?:\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/5

超级短(?:\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/8