如何用正则表达式匹配多行日志中有效「OPEN...START」结构并统计次数
有效OPEN-START配对的正则匹配实现
前置规则确认
- 日志中的
OPEN、START均为单独占一行的标记,而非行内子串 - 异常场景下前序无配对START的OPEN需要完全忽略,仅统计「最近一个OPEN到后续第一个START」的有效配对
正则表达式实现
开启**多行匹配模式(m)**后使用以下正则:^OPEN$\r?\n(?:(?!^OPEN$|^START$).*\r?\n)*?^START$
语法说明
^OPEN$:锚定单独为一行的OPEN标记,多行模式下^/$可匹配每行的首尾边界\r?\n:匹配OPEN行后的换行符,适配Windows/Unix不同换行格式(?:(?!^OPEN$|^START$).*\r?\n)*?:非贪婪匹配中间的所有多行日志内容,通过负向前瞻排除中间出现的独立行OPEN/START,避免错误截断^START$:锚定单独为一行的START标记,作为配对的结束边界
适配调整
- 如果OPEN/START行存在前后空格的情况,可调整正则为:
^[ \t]*OPEN[ \t]*$\r?\n(?:(?!^[ \t]*OPEN[ \t]*$|^[ \t]*START[ \t]*$).*\r?\n)*?^[ \t]*START[ \t]*$ - 如果需要匹配行内嵌入的OPEN/START标记,可移除正则中的行边界锚定
^/$
匹配效果验证
针对提到的异常日志结构:
OPEN 无配对的前序日志内容 OPEN 有效配对的日志内容 START
上述正则仅会匹配第二个OPEN到START的完整片段,不会将前序无配对的OPEN纳入统计,匹配结果的总个数即为有效配对的统计次数。
内容的提问来源于stack exchange,提问作者Michel Mechoui
相关产品推荐
相关产品推荐

