带正向预查的多行正则匹配日志在安全事件管理器失效问询
原正则失效原因
- 贪婪匹配问题:原正则
((\r||.|\n)*)为贪婪匹配,会一次性吞掉从第一个时间戳到最后一个时间戳前的所有内容,无法按单条日志拆分 - 非规范语法兼容问题:
\r||.|\n中的空分支(两个竖线中间的空内容)属于非标准写法,仅在regex101等宽松正则引擎下生效,安全事件管理器的严格正则引擎不支持该语法 - 缺少结束兼容逻辑:正向预查仅匹配下一个时间戳,会漏掉最后一条无后续时间戳的日志
空分支生效原因解释
你加入的||实际是新增了「匹配空内容」的规则,误打误撞解决了原正则遇到连续换行、空行时的匹配中断问题,但该写法没有通用性,属于错误写法。
兼容版正则方案(全引擎支持,无需额外修饰符)
(\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}|$)
方案说明
[\s\S]*?:匹配所有字符(包含换行、回车、空格、特殊字符),*?为非贪婪匹配,保证匹配到下一个时间戳就停止- 正向预查结尾加
|$:兼容最后一条日志后无后续时间戳的场景,不会漏掉最后一条日志 - 移除了冗余的
\s{1}写法(\s默认匹配单个空格,无需额外指定{1}),语法更规范
匹配效果说明
针对你提供的示例日志:
Tue Sep 14 08:57:47 2021
Thread 1 advanced to log sequence 186 (LGWR switch)
Current log# 2 seq# 186 mem# 0: D:\ORADB\DV1\REDO02A.LOG
Current log# 2 seq# 186 mem# 1: H:\ORADB\DV1\REDO02B.LOG
Tue Sep 14 09:07:40 2021
Thread 1 advanced to log sequence 187 (LGWR switch)
Current log# 3 seq# 187 mem# 0: D:\ORADB\DV1\REDO03A.LOG
Current log# 3 seq# 187 mem# 1: H:\ORADB\DV1\REDO03B.LOG
Tue Sep 14 09:22:09 2021
Thread 1 advanced to log sequence 188 (LGWR switch)
Current log# 4 seq# 188 mem# 0: D:\ORADB\DV1\REDO04A.LOG
Current log# 4 seq# 188 mem# 1: H:\ORADB\DV1\REDO04B.LOG
会正确拆分出3组捕获结果,每组的$1为时间戳,$2为对应的日志全文。
内容的提问来源于stack exchange,提问作者MSDUV

