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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:25:19