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
相关产品推荐
相关产品推荐

