正则表达式需求:匹配内容至<message>组直到下一行以时间开头
正则表达式解决方案
最终可用正则
/(?P<time>^\d{2}:\d{2}:\d{2}\.\d{3})\s?(?P<Token>\[T:\d+\])?\s?(?P<event_type>\{\w+:\d+\})?\s?(?P<message>.*(?:\n(?!\d{2}:\d{2}:\d{2}\.\d{3}).*)*)/gm
问题分析与修正说明
你前三个正则的核心问题:
- 第一个用
(?=\d{2})作为终止断言,会在任意两位数字前停止匹配,导致内容截断且丢失后续行。 - 第二个和第三个仅能匹配单行内容,未处理跨行的非时间开头行。
- 第一个用
新正则的关键改进:
- 精准时间匹配:明确限定时间格式为
HH:MM:SS.XXX,避免误匹配其他数字开头的内容。 - 跨行消息捕获:通过
(?:\n(?!\d{2}:\d{2}:\d{2}\.\d{3}).*)*匹配所有后续行,只要该行不是以时间格式开头就纳入message分组。其中(?!...)是负向前瞻断言,确保匹配终止于下一个时间行的开头。
- 精准时间匹配:明确限定时间格式为
匹配验证
针对你提供的示例文本,该正则会准确捕获你标注的5个message分组内容,完全符合预期。
内容的提问来源于stack exchange,提问作者newmember
相关产品推荐
相关产品推荐

