使用正则将邮件文本转对象数组:循环分隔信息块的实现问题
JavaScript 提取邮件文本信息块转为对象数组方案
我来帮你搞定这个问题!你要处理的是从邮件里提取的结构化文本,把每一行的信息转成对象存进数组对吧?之前卡在循环分隔信息块的地方,我给你整理了一套可行的实现思路和代码:
实现步骤
分割原始文本为单个信息块:
你的每个信息块都是单独一行,所以先用split('\n')把整个文本拆成一行行的,再用filter去掉空行或者无效的空白行,避免处理无效内容。遍历每个信息块,解析为对象:
用正则表达式匹配每个信息块里的键: 值结构,把匹配到的键值对逐个添加到对象中,最后把对象存入数组。
完整代码示例
// 假设这是你从邮件里提取的原始文本 const emailExtractedText = `Name: Andy Computer: ABC IP: 192.168.0.1 Added By: Maria Timestamp: 2018-03-15 08:45:08 +0000 UTC Name: Richard Computer: CDE IP: 192.168.0.2 Timestamp: 2018-03-15 08:45:08 +0000 UTC`; // 用来存储最终结果的数组 const infoArray = []; // 第一步:拆分文本为单个信息块,过滤空行 const infoBlocks = emailExtractedText.split('\n').filter(block => block.trim() !== ''); // 第二步:遍历每个信息块,解析成对象 infoBlocks.forEach(block => { const currentInfo = {}; // 正则匹配带空格的键名(比如Added By)和对应的值 // 解释下正则: // ([\w\s]+) 匹配键名,支持带空格的情况 // :\s* 匹配冒号和后面的任意空格 // (.+?) 非贪婪匹配值,避免把后面的键名包含进来 // (?=\s+[\w\s]+:|$) 正向预查,确保匹配到下一个键名或者行尾就停止 const regexPattern = /([\w\s]+):\s*(.+?)(?=\s+[\w\s]+:|$)/g; let matchResult; // 循环提取所有键值对 while ((matchResult = regexPattern.exec(block)) !== null) { const key = matchResult[1].trim(); const value = matchResult[2].trim(); currentInfo[key] = value; } // 把解析好的对象存入数组 infoArray.push(currentInfo); }); // 打印结果看看效果 console.log(infoArray);
代码说明
- 正则表达式我特意调整成支持带空格的键名(比如示例里的
Added By),如果你的键名都是单个单词,也可以把正则里的[\w\s]+换成\w+,效果一样。 filter方法用来过滤空行,避免处理那些没有内容的无效行,让代码更健壮。- 用
while循环配合regex.exec()可以逐个提取每个信息块里的所有键值对,确保不会遗漏任何信息。
内容的提问来源于stack exchange,提问作者Junchen Liu
相关产品推荐
相关产品推荐

