我目前正在尝试用regex读取日志文件。我的日志以时间戳开头,后面是一个随机的多行消息,可以包含多个新行、返回和所有类型的字符。
regex应该捕获以时间戳开始的所有内容,即实际的日志消息,直到我们到达新的时间戳为止。目前,我通过使用正的前瞻性来实现这一点,直到下一个时间戳。
在less端regex101上,代码或多或少地起作用。在我们的安全事件管理器中,相同的正则表达式不起作用。我需要保存每个事件,时间戳是第一个捕获组,日志消息是第二个捕获组。
(\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
顺便说一句,只有当我包含正则表达式中的\r||.|\n“或null”部分时,代码才能工作,这一点我完全不理解。
发布于 2021-09-14 10:50:51
您可以使用[\s\S]*匹配任何字符,因为\s用于空格(包括新行),而\S用于非空白。为了不跨越整个文本,换句话说,为了使其不贪婪,请使用?符号,例如,[\s\S]*?尝试这样的模式:
(\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 -或者下一部分必须是字符串的结尾) -前瞻性断言的结尾。请注意,由于前面的模式是非贪婪的,这将始终是最近的时间戳,因此永远是下一个时间戳。https://stackoverflow.com/questions/69176196
复制相似问题