JavaScript正则表达式拆分邮件列表为基础组件的问题
解析带复杂格式的邮箱列表字符串
看起来你卡在了处理带引号且内部含逗号的邮箱条目上——直接用逗号分割肯定不行,因为引号里的逗号是显示名的一部分。这里给你一个用正则表达式解决的方案,能完美处理你列出的所有格式:
实现代码
var emailList = 'peter@pan.com, lucky <jack@pot.com>, "William Tell" <billy@tell.com>, "John Rambo, III" <johnny@rambo.com>, "there, might, be, several, commas inside the quotes" <multiple@commas.com>, "yes, this is also a valid email address, can you believe" <yes@this@is@valid.com>'; // 匹配所有合法邮箱条目的正则表达式 const emailEntryRegex = /"([^"]+)"\s*<([^>]+)>|([^,<]+)(?:\s*<([^>]+)>)?/g; let matchResult; const parsedEmailList = []; // 循环匹配每个邮箱条目 while ((matchResult = emailEntryRegex.exec(emailList)) !== null) { let displayName, emailAddress; // 处理带双引号的显示名场景(内部可包含逗号) if (matchResult[1]) { displayName = matchResult[1].trim(); emailAddress = matchResult[2].trim(); } else { // 处理不带引号的场景:纯邮箱 或 普通显示名+邮箱 if (matchResult[4]) { displayName = matchResult[3].trim(); emailAddress = matchResult[4].trim(); } else { displayName = null; // 无显示名的纯邮箱 emailAddress = matchResult[3].trim(); } } parsedEmailList.push({ displayName, emailAddress }); } // 输出解析结果 console.log(parsedEmailList);
代码说明
- 正则表达式逻辑:
- 第一部分
"([^"]+)"\s*<([^>]+)>:专门匹配带双引号的显示名(内部允许任意字符除了双引号),以及后面紧跟的<邮箱地址>,捕获显示名和邮箱地址。 - 第二部分
([^,<]+)(?:\s*<([^>]+)>)?:匹配两种情况:- 纯邮箱地址(没有显示名,格式符合
[^,<]+,即不含逗号和左尖括号) - 不带引号的显示名(不含逗号和左尖括号)加
<邮箱地址>的组合
- 纯邮箱地址(没有显示名,格式符合
- 第一部分
- 循环匹配:通过
exec()循环遍历整个字符串,把每个匹配到的条目解析成包含displayName(显示名,可为null)和emailAddress(邮箱地址)的对象,存入数组。
测试结果
运行代码后,parsedEmailList会得到如下结构的数组(示例前几项):
[ { displayName: null, emailAddress: 'peter@pan.com' }, { displayName: 'lucky', emailAddress: 'jack@pot.com' }, { displayName: 'William Tell', emailAddress: 'billy@tell.com' }, { displayName: 'John Rambo, III', emailAddress: 'johnny@rambo.com' }, // ... 剩余条目 ]
这个方案能完美处理你提到的所有边缘情况,包括显示名内有多个逗号、带特殊格式的邮箱地址等。
内容的提问来源于stack exchange,提问作者Jay Frias
相关产品推荐
相关产品推荐

