我正在尝试使用一个相当复杂的REGEX表达式(请参见下面的REGEX101演示),我对该站点的专家创建的表达式进行了小幅修改。它解析日志事件的特定模式:
这些日志序列将始终以EXE_IN
或EXE_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函数)。
非常感谢。
答案 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)