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

Node脚本中如何用正则提取含嵌套括号的JSON函数参数?

提取$translateProvider.translations嵌套JSON参数的解决方案

可行的正则表达式

针对你的需求,要匹配包含嵌套大括号的JSON对象,可以使用支持递归匹配的正则(ES2018及以上版本支持,Node.js 10+已兼容):

/'de'\s*,\s*({(?:[^{}]|(?R))*})/gms

正则说明

  • 'de':精准匹配目标语言标识
  • \s*,\s*:匹配逗号及前后任意空白字符(包括换行)
  • ({(?:[^{}]|(?R))*}):核心的嵌套大括号匹配逻辑:
    • {(?:[^{}]|(?R))*}:匹配最外层大括号,内部允许两种内容:非大括号字符,或者递归匹配整个大括号结构(完美处理嵌套)
  • gms修饰符:
    • g:全局匹配所有符合条件的片段
    • m:多行模式,支持跨换行匹配
    • s:让匹配逻辑支持换行场景

为什么之前的正则失效

你之前尝试的\'de'\s*,\s*{([^}]*)})和\'de'\s*,\s*{([^})]*)}都存在逻辑缺陷:

  • [^}]是否定字符集,会匹配任何非}的字符,一旦遇到第一个闭合大括号就会终止匹配,完全无法处理嵌套的大括号结构,自然提取不到完整的JSON对象。

Node.js 实现示例

以下是完整的脚本代码,包含文件遍历、匹配提取、JSON合并和写入:

const fs = require('fs');
const path = require('path');

// 从单个文件提取德语翻译
function extractDeTranslations(filePath) {
  const content = fs.readFileSync(filePath, 'utf8');
  const regex = /'de'\s*,\s*({(?:[^{}]|(?R))*})/gms;
  let match;
  const translations = {};

  while ((match = regex.exec(content)) !== null) {
    try {
      // 处理单引号转双引号(适配JSON.parse的要求)
      const jsonStr = match[1]
        .replace(/(?<!\\)'/g, '"') // 非转义单引号替换成双引号
        .replace(/\\'/g, "'"); // 还原转义的单引号为普通单引号
      
      const json = JSON.parse(jsonStr);
      Object.assign(translations, json);
    } catch (err) {
      console.error(`解析文件 ${filePath} 失败:`, err.message);
    }
  }

  return translations;
}

// 遍历目录下所有JS文件并合并翻译
function mergeAllDeTranslations(dirPath) {
  const mergedTranslations = {};
  const files = fs.readdirSync(dirPath);

  for (const file of files) {
    const fullPath = path.join(dirPath, file);
    if (fs.statSync(fullPath).isFile() && fullPath.endsWith('.js')) {
      const fileTrans = extractDeTranslations(fullPath);
      Object.assign(mergedTranslations, fileTrans);
    }
  }

  // 写入合并后的JSON文件
  fs.writeFileSync('merged-de-translations.json', JSON.stringify(mergedTranslations, null, 2));
  console.log('德语翻译合并完成,已生成 merged-de-translations.json');
}

// 替换为你的JS文件目录路径
mergeAllDeTranslations('./path-to-your-js-files');

注意事项

  • 如果你的JS文件中存在转义字符或复杂字符串,可能需要微调单引号转双引号的逻辑,避免JSON解析报错
  • 确保Node.js版本在10以上,以支持递归正则语法

内容的提问来源于stack exchange,提问作者domjanzsoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:50:36