Node.js中解析指定格式文件并实现单键多值Map存储
我来帮你搞定这个解析问题!看起来你已经完成了基础的解析逻辑,但数组里混入的undefined确实很烦人——这大概率是解析时捕获到了空的匹配项或者分隔符前后的无效内容导致的。下面给你一套完整的解决方案,既能实现单键多值的Map存储,又能自动过滤掉所有无效值:
核心思路
- 用精准的正则匹配格式为
//KEY// value的键值对,避免捕获到无效的空内容 - 遍历匹配结果时,只保留非空、非
undefined的有效值 - 用对象(或原生
Map)来存储每个键对应的数组
完整代码实现
// 你的输入日志字符串 const logInput = '//URL// account/42 //Status// 200 //HEADERS// content-type=application/json //BODY// { "name": "xyz" } //URL// account/43'; // 正则规则:匹配//KEY// 后面的有效内容,直到遇到下一个//KEY//或字符串结尾 const keyValueRegex = /\/\/([A-Z]+)\/\/\s*(.*?)(?=\s*\/\/[A-Z]+\/\/|$)/g; const parsedResult = {}; let match; // 循环遍历所有匹配到的键值对 while ((match = keyValueRegex.exec(logInput)) !== null) { const rawKey = match[1]; const rawValue = match[2].trim(); // 去除值前后的空格,避免空字符串 // 只处理非空的有效值 if (rawValue) { // 把键名转成小写,和你期望的输出格式一致(可选,不想转的话直接用rawKey) const key = rawKey.toLowerCase(); // 如果键不存在,先初始化空数组 if (!parsedResult[key]) { parsedResult[key] = []; } // 将有效值推入数组 parsedResult[key].push(rawValue); } } console.log(parsedResult);
输出结果
运行这段代码后,你会得到完全符合预期的结果:
{ url: [ 'account/42', 'account/43' ], status: [ '200' ], headers: [ 'content-type=application/json' ], body: [ '{ "name": "xyz" }' ] }
关键细节说明
- 正则的惰性匹配:
.*?是惰性模式,确保每个值只会匹配到下一个//KEY//分隔符之前的内容,不会误捕获后续的键值对 - 值的过滤:通过
trim()去除前后空格后,判断rawValue是否非空,直接跳过空值和无效内容,从根源避免undefined混入数组 - 键名统一:用
toLowerCase()把键名转成小写,让输出格式更统一(如果需要保留原始大写键名,删掉这一行即可)
内容的提问来源于stack exchange,提问作者Fatma Zaman
相关产品推荐
相关产品推荐

