首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有前瞻性的多行正则表达式

具有前瞻性的多行正则表达式
EN

Stack Overflow用户
提问于 2021-09-14 10:36:25
回答 1查看 52关注 0票数 1

我目前正在尝试用regex读取日志文件。我的日志以时间戳开头,后面是一个随机的多行消息,可以包含多个新行、返回和所有类型的字符。

regex应该捕获以时间戳开始的所有内容,即实际的日志消息,直到我们到达新的时间戳为止。目前,我通过使用正的前瞻性来实现这一点,直到下一个时间戳。

在less端regex101上,代码或多或少地起作用。在我们的安全事件管理器中,相同的正则表达式不起作用。我需要保存每个事件,时间戳是第一个捕获组,日志消息是第二个捕获组。

代码语言:javascript
复制
(\w{3}\s{1}\w{3}\s{1}\d{2}\s{1}\d{2}\:\d{2}\:\d{2}\s{1}\d{4})((\r||.|\n)*)(?=(\w{3}\s{1}\w{3}\s{1}\d{2}\s{1}\d{2}\:\d{2}\:\d{2}\s{1}\d{4}))

示例日志:

9月14日08:57:47 2021线程1先进到日志序列186 (LGWR开关)当前log# 2 seq# 186 mem# 0: D:\ORADB\DV1\REDO02A.LOG Current log# 2 seq# 186 mem# 1: H:\ORADB\DV1\REDO02B.LOG Tue 9月14日09:07:40 2021线程1先进到日志序列187 (LGWR开关)当前log# 3 seq# 187 mem# 0: D:\ORADB\DV1\REDO03A.LOG电流log# 3 seq# 187 mem# 1: H:\ORADB\DV1\REDO03B.LOG Tue 9月14日09:22:09 2021线程1先进到日志序列188 (LGWR开关)当前log# 4 seq# 188 mem# 0: D:\ORADB\DV1\REDO04A.LOG Current log# 4 seq# 188 mem# 1: H:\ORADB\DV1\REDO04B.LOG

regex101

顺便说一句,只有当我包含正则表达式中的\r||.|\n“或null”部分时,代码才能工作,这一点我完全不理解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-14 10:50:51

您可以使用[\s\S]*匹配任何字符,因为\s用于空格(包括新行),而\S用于非空白。为了不跨越整个文本,换句话说,为了使其不贪婪,请使用?符号,例如,[\s\S]*?尝试这样的模式:

代码语言:javascript
复制
(\w{3}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s\d{4})([\s\S]*?)(?=\w{3}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s\d{4}|\Z)

其中:

  • ( -第一次捕获组的开始
    • \w{3}\s\w{3}\s\d{2}\s - Match Tue Sep 14
    • \d{2}:\d{2}:\d{2}\s\d{4} - Match 08:57:47 2021

  • ) -第一次捕获组的结束
  • ( -第二次捕获组的开始
    • [\s\S]*? -匹配任何字符,包括新行。比赛将以一种不急躁的方式进行(因此是最不可能的比赛)。

  • ) -第二捕捉组的末端
  • (?= -前瞻性断言的开始
    • \w{3}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s\d{4} -下一部分必须是时间戳(这与整个正则表达式第一部分中时间戳的匹配模式相同)。
    • | -或
    • \Z -或者下一部分必须是字符串的结尾

  • ) -前瞻性断言的结尾。请注意,由于前面的模式是非贪婪的,这将始终是最近的时间戳,因此永远是下一个时间戳。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69176196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档