You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式匹配title1至title2前的目标代码块?

正则提取指定区块的解决方案

问题描述

我有如下格式的字符串:

title1:
{key1=val1,
key2=val2,},
{key1=val1,
key2=val2,},
title2:
{key1=val1,
key2=val2,},

希望提取title1之后、title2之前,从第一个{开始到第二个},结束的代码块。尝试了如下正则但未达到预期:

^title1:\s*(?:{[^}\s\S]*},)*

原正则的预期逻辑:

  • 匹配行首的title1:
  • 匹配后续任意空白字符(包括换行)
  • 重复匹配分组:以{开头,后跟任意数量非}的字符,以},结尾

问题分析

原正则失效的核心原因是[^}\s\S]字符集逻辑错误:\s(空白字符)和\S(非空白字符)已经覆盖了所有字符,再用[^}]取反,等于没有字符能满足匹配条件,导致分组内容无法匹配。

正确正则表达式

方案1:精准匹配两个{...},块

^title1:\s*((?:{[\s\S]*?},)\s*){2}

逻辑说明:

  • ^title1: 匹配行首的title1:
  • \s* 匹配title1:之后的任意空白(包括换行)
  • (?:{[\s\S]*?},):非捕获分组,用[\s\S]*?非贪婪匹配任意字符(包括换行),直到遇到},,确保匹配单个{...},块
  • {2}:重复匹配两次上述分组,刚好覆盖两个目标块
  • \s* 匹配块之间的空白(比如换行)

方案2:匹配title1到title2之间的所有内容(更通用)

如果不确定块的数量,只想提取title1之后到title2之前的全部内容,可以用正向预查:

^title1:\s*([\s\S]*?)(?=\s*title2:)

逻辑说明:

  • (?=\s*title2:) 是正向预查,匹配到title2:(前面可带空白)时停止,不会把title2:包含到结果里
  • [\s\S]*? 非贪婪匹配任意字符,确保只取到title2:之前的内容

内容的提问来源于stack exchange,提问作者roediGERhard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:52:09