如何使用带非贪婪匹配的可选正向预查正则解析一行多条目日志
解决方案
你需要调整的核心是给正向预查补充行尾匹配规则、增加全局匹配标志,同时优化时间标识的匹配规则,避免和日志内容里的[1]这类短方括号内容混淆。
可用正则表达式
/\[\d{6}\|[\d:.]+\|\d+\].*?(?=\[\d{6}\||\n|$)/g
如果需要批量处理带换行的多行日志,可额外加s标志让.匹配换行符:
/\[\d{6}\|[\d:.]+\|\d+\].*?(?=\[\d{6}\||$)/gs
规则说明
- 前缀
\[\d{6}\|[\d:.]+\|\d+\]精准匹配时间标识:要求方括号内必须有6位日期开头、带|分隔符,完全区别于日志内容里仅带单个数字的[#]格式,不会误判 - 中间
.*?是非贪婪匹配,尽可能短的匹配后续日志内容 - 末尾正向预查
(?=\[\d{6}\||\n|$)表示:匹配到下一个时间标识开头、换行符或者文本末尾就停止,完美覆盖单条日志到行尾、多条日志在同一行的两种场景 - 末尾的
g是全局匹配标志,会返回所有符合规则的匹配结果,不会只返回第一条
Angular/TS 中使用示例
// 日志文本 const rawLog = `[210616|13:46:32.738|00017] --> CONFD_OK [210616|13:46:32.738|00017] TRACE CDB_EXISTS /managed-element/fault-management/active-alarm/active-alarm-entries{oru oran-vendor-specific-alarm ORU[1]-ORU[1]/carrier0/antenna34/1004}[210616|13:46:32.738|00017] --> CONFD_OK [210616|13:46:32.738|00017] TRACE CDB_END_SESSION [210616|13:46:32.738|00017] --> CONFD_OK [210616|13:46:38.361|00270] TRACE Established new CDB session to ConfD`; const logRegex = /\[\d{6}\|[\d:.]+\|\d+\].*?(?=\[\d{6}\||\n|$)/g; // 匹配后过滤空项、去除前后空格 const parsedLogs = rawLog.match(logRegex)?.map(item => item.trim()).filter(Boolean) || [];
执行后parsedLogs就是你需要的5条预期结果。
内容的提问来源于stack exchange,提问作者bitbytten
相关产品推荐
相关产品推荐

