如何用正则表达式匹配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
相关产品推荐
相关产品推荐

