Sublime如何快速将JSON键名提取为数组?(数据处理技巧)

1次阅读

sublime text可用正则”(1+)”s:提取json所有键名,替换为”$1″,;需勾选Regex、关闭自动补全;顶层键可配合折叠或^s”(1+)”s*:;最后补方括号、删末逗号得合法js数组。” ↩

Sublime如何快速将JSON键名提取为数组?(数据处理技巧)

用正则批量提取 json 键名(Sublime 原生支持)

sublime text 本身不带“JSON 键转数组”按钮,但靠自带的正则查找替换就能一步到位。关键不是写新插件,而是找准键名在 JSON 中的文本模式。

常见错误是直接搜 "w+": —— 这会漏掉带中划线、数字开头、空格或 Unicode 的键(比如 "user-id""2fa_enabled""昵称"),也会误中字符串值里的引号内容。

  • 正确正则模式:"([^"]+)"s*:(匹配所有双引号包裹、后紧跟冒号的键名)
  • 替换为:"$1",(保留引号,加英文逗号,方便后续拼成数组)
  • 务必勾选 RegexJSON 模式下关闭自动补全(避免替换时触发格式化把换行吃掉)

处理嵌套对象和数组边界(避免多层键名混在一起)

如果 JSON 里有嵌套对象或数组,比如 {"user": {"name": "a", "age": 20}},默认正则会把 "user""name""age" 全提出来——但你可能只要顶层键。

这时得靠 Sublime 的 折叠功能辅助限定范围:先折叠所有子对象(Ctrl+Shift+[),再对展开的顶层做查找替换;或者用更保守的正则:^s*"([^"]+)"s*:(加 ^s* 确保是行首缩进后的键)。

  • 嵌套越深,纯正则越难区分层级——别硬刚,先手动折叠再操作更稳
  • 如果目标是“所有键(无论层级)”,就用第一个正则,但替换后要人工删重复项
  • 注意数组项([{...}, {...}])内部的键也会被扫到,如不需要,提前删掉数组部分或加负向断言(但 Sublime 正则不支持 (?!...),慎用)

生成合法 JavaScript 数组(补括号、去末尾逗号)

替换完得到一 "key1", "key2", "key3",,但末尾多一个逗号,直接粘贴进 JS 会报 SyntaxError: Unexpected Token ','

  • 替换第二步:搜 ,s*$(行尾逗号),替为空,解决语法错误
  • 再手动在开头加 [",结尾加 "],或用多光标:按住 Ctrl 点两头,输入括号
  • 如果键名含双引号或反斜杠(极少见但 JSON 允许),"([^"]+)" 会截断——此时必须改用 JSON 解析器,Sublime 正则无解

为什么不用在线工具或 Python 脚本?

临时处理小 JSON(几百行内),Sublime 正则比切窗口、粘贴、等加载、再复制快得多。但一旦遇到以下情况,就该停手换工具:

  • JSON 格式不合法(缺引号、注释、尾逗号)——Sublime 查找不报错,但结果错得无声无息
  • 需要过滤键名(比如只要以 is_ 开头的)、或按值类型筛选(只提 String 类型的键)——正则做不到语义判断
  • 要批量处理多个文件——写个 jq 命令一行搞定:jq 'paths(scalars) | select(Length > 0) | join(".")' file.json

真正卡住人的往往不是正则怎么写,而是没意识到 JSON 文本里那些看似无关的空格、换行、注释,会让 "([^"]+)"s*: 匹配失败——建议先用 Ctrl+Shift+PJSON: Reindent 整理格式再动手。

text=ZqhQzanResources