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

如何在JavaScript中通过正则表达式获取多个邮箱地址?

解决正则匹配多个邮箱返回null或重复结果的问题

问题根源分析

你遇到的问题主要出在两个地方:

  1. 正则定义方式错误:你把正则表达式写成了字符串而非正则对象,直接在字符串末尾加/g会让JavaScript把/g当成正则要匹配的内容之一,而你的JSON字符串里根本没有这部分,自然返回null。
  2. 多余的捕获组:原正则里的括号是捕获组,当不使用全局匹配时,match()会返回包含「完整匹配内容」和「捕获组内容」的数组,这就是为什么你得到了重复的"asdasd@asd.com"。

解决方案

方案1:使用正则字面量(推荐,更简洁直观)

直接用正则字面量定义规则,去掉多余的捕获组(你只需要匹配邮箱本身),同时加上全局匹配标志g:

// 去掉括号(捕获组),添加全局匹配标志g
var re = /[a-zA-Z0-9+._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+/g;
var s = {a:12, b: 'asdasd@asd.com', c:'as123@asd.com'};
var x = JSON.stringify(s);
var z = x.match(re);
console.log(z); // 输出: ["asdasd@asd.com", "as123@asd.com"]

方案2:使用RegExp构造函数(适合动态生成正则的场景)

如果你的正则需要动态生成,就用RegExp构造函数,注意转义字符串里的反斜杠,并且单独传入全局标志:

// 转义反斜杠,去掉捕获组
var reStr = '[a-zA-Z0-9+._-]+@[a-zA-Z0-9._-]+\\.[a-zA-Z0-9_-]+';
// 第二个参数传入全局标志g
var re = new RegExp(reStr, 'g');
var s = {a:12, b: 'asdasd@asd.com', c:'as123@asd.com'};
var x = JSON.stringify(s);
var z = x.match(re);
console.log(z); // 输出: ["asdasd@asd.com", "as123@asd.com"]

补充说明

  • 当正则带有g标志时,match()会直接返回所有匹配结果的数组,不会包含捕获组内容;
  • 如果你确实需要捕获组并全局匹配,得用exec()循环遍历获取结果,但你这个场景完全不需要捕获组,直接去掉更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:54