如何在JavaScript中通过正则表达式获取多个邮箱地址?
解决正则匹配多个邮箱返回null或重复结果的问题
问题根源分析
你遇到的问题主要出在两个地方:
- 正则定义方式错误:你把正则表达式写成了字符串而非正则对象,直接在字符串末尾加
/g会让JavaScript把/g当成正则要匹配的内容之一,而你的JSON字符串里根本没有这部分,自然返回null。 - 多余的捕获组:原正则里的括号是捕获组,当不使用全局匹配时,
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
相关产品推荐
相关产品推荐

