如何用Regex捕获YAML中指定模板的完整数据?
解决方案:捕获YAML中指定模板的关联字段数据
核心思路
利用YAML的缩进层级特征,先精准匹配目标模板行,再锁定其下属的description、define、write字段行,通过正则分组和预查逻辑实现完整数据的捕获。
基础场景正则方案(字段值单行)
假设你的YAML结构如下:
templates: name_template_1: description: "模板1描述" define: "模板1定义" write: "模板1写入规则" name_template_2: description: "模板2描述" define: "模板2定义" write: "模板2写入规则"
使用以下正则可完整匹配name_template_2及其关联字段:
name_template_2:\n(?:\s{2,}description:.*\n)?(?:\s{2,}define:.*\n)?(?:\s{2,}write:.*\n?)?
正则拆解
name_template_2:精准匹配目标模板行\n匹配模板行后的换行符(?:\s{2,}description:.*\n)?非捕获组,匹配下属的description字段(?表示该字段可选)\s{2,}匹配至少2个空格(对应YAML的缩进层级,确保是当前模板的下属字段).*匹配字段内容
- 同理,
(?:\s{2,}define:.*\n)?和(?:\s{2,}write:.*\n?)?分别匹配define和write字段
捕获字段值的正则方案
如果需要单独提取每个字段的内容,可添加捕获组:
name_template_2:\n(?:\s{2,}description:\s*(.*)\n)?(?:\s{2,}define:\s*(.*)\n)?(?:\s{2,}write:\s*(.*)\n?)?
在regex101的「Match Groups」面板中,可直接查看description、define、write对应的字段值。
进阶场景:字段值含换行
若字段值是YAML折叠块(多行内容),可使用带正向预查的正则,确保匹配到下一个同级字段或文本结束:
name_template_2:\n(?:\s{2,}description:\s*(?:[\s\S]*?)(?=\n\s{0,2}[^\s]|\Z))?(?:\s{2,}define:\s*(?:[\s\S]*?)(?=\n\s{0,2}[^\s]|\Z))?(?:\s{2,}write:\s*(?:[\s\S]*?)(?=\n\s{0,2}[^\s]|\Z))?
关键说明
[\s\S]*?匹配任意字符(包括换行),?表示非贪婪匹配,避免过度匹配(?=\n\s{0,2}[^\s]|\Z)正向预查,匹配到下一个同级字段(缩进≤2个空格)或文本结尾时停止
注意事项
- 确保YAML使用空格缩进而非制表符,若用制表符可将正则中的
\s{2,}替换为\t+ - 若模板字段的缩进量不同,需调整
\s{2,}中的数字匹配实际缩进
内容的提问来源于stack exchange,提问作者NB art
相关产品推荐
相关产品推荐

