sublime中匹配键值对应使用^(s+):s*(.+)$,可捕获行首冒号分隔的键值(如name: john);需注意s+兼容连字符等非空白字符,开启. matches newline才支持跨行值,且替换时用$1 "$2"并捕获缩进^(s*)(s+):以保留对齐。

Sublime 中匹配键值对的正则怎么写
直接用 ^(w+):s*(.+)$ 就能捕获大多数冒号分隔的键值对(如 name: John),但要注意:开头必须是行首 ^,否则会跨行或误匹配注释里的冒号;w+ 只覆盖字母数字下划线,遇到带连字符的键(如 user-id)会截断,这时得换成 [^s:]+;值部分用 .+ 默认不跨行,如果值含换行,需开启 . 匹配换行选项(Alt+R → 勾选 .)。
把 YAML 键值对转成 JSON 格式要改哪些地方
核心是两步替换:先补双引号,再换冒号为冒号加空格。搜索用 ^([^s:]+):s*(.+)$,替换为 "$1": "$2"。但注意几个坑:
- 原值本身含双引号(如
desc: "he said "hi"")→ 替换后会破坏 JSON 结构,得先全局把"替成\",或改用"$1": $2(不加外层引号,靠后续 JSON 验证工具处理) - 布尔值或数字(如
active: true、count: 42)不该加引号 → 正则无法智能判断类型,建议分两轮:先处理字符串型(加引号),再手动或用额外正则修 Boolean/Number - 末尾逗号问题:JSON 数组/对象内最后一个键值对不能有逗号,但 Sublime 批量替换无法“判断是否为最后一行”,得靠后续格式化工具(如 Prettier)自动清理
为什么替换后缩进全乱了,如何保留原始对齐
因为正则替换默认丢弃原始空白。解决方法是把缩进也捕获进分组:搜索 ^(s*)([^s:]+):s*(.+)$,替换为 "": ""。这样 会原样保留行首空格或 Tab。但要注意:
- 如果原文件混用空格和 Tab,
s*会一并捕获,结果一致;但若想强制统一为 2 空格缩进,替换时把$1换成固定(两个空格) - YAML 允许无缩进的顶层键,而 JSON 对象通常缩进 2 或 4 空格——批量转换后建议立刻用
Ctrl+Shift+P→Set Syntax: JSON再Ctrl+Shift+P→Reindent统一格式
遇到嵌套结构(如列表或对象)还能用正则硬刚吗
不能。正则无法可靠解析嵌套层级,比如 users: 下跟一个缩进块或 - name: A 这样的列表项,^([^s:]+): 会错误匹配到 name 行,却丢失其所属的 users 上下文。此时应该:
- 先人工用
Ctrl+Shift+P→Expand Selection to Brackets或Expand Selection to Indentation把嵌套块单独选中,再对子区域运行正则 - 更稳妥的做法是导出为 .yaml 文件,用 Python 脚本调
PyYAML解析再转 JSON —— Sublime 正则只适合扁平键值对清洗,不是解析器 - 如果只是想高亮或临时调整,可用
Ctrl+Click多点选中所有:,再Ctrl+Shift+L拆成多光标,手动补引号,比写复杂正则更快
真正麻烦的永远不是第一层键值对,而是那些看似规则、实则依赖上下文的缩进块和列表项——正则在这里不是不够强,而是用错了场合。











