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

如何用JavaScript匹配含多个点的邮箱地址@后目标部分?

解决邮箱@后多域名部分提取问题

嘿,我完全懂你的困扰!你原来的正则因为JS不支持后行断言做了修改,但用.*?非贪婪匹配的话,碰到带多个点的邮箱(比如foo@sub.domain.com)时,会在第一个.就停下,只能拿到sub而不是你想要的完整前缀部分对吧?

方案1:修正正则匹配到最后一个.之前的内容

如果你的需求是提取@之后到**最后一个.**之前的所有内容(也就是包含子域名的完整主域名部分),可以用这个正则:

/@(.*)(?=\.[^.]+$)/

正则解释:

  • @:精准匹配邮箱里的@符号
  • (.*):贪婪匹配@之后的所有字符,直到后面的断言条件满足
  • (?=\.[^.]+$):正向先行断言,确保后面跟着一个.,然后是一段不含.的字符串(也就是域名的后缀,比如.com、.co.uk的最后部分)直到字符串结尾

测试示例:

// 单后缀邮箱
const [_, part1] = "foo@bar.com".match(/@(.*)(?=\.[^.]+$)/);
console.log(part1); // 输出 "bar"

// 多子域名邮箱
const [_, part2] = "foo@mailinator.co.uk".match(/@(.*)(?=\.[^.]+$)/);
console.log(part2); // 输出 "mailinator.co"

方案2:用字符串方法更直观

其实不用正则也能轻松搞定,字符串操作可能更易懂,不容易踩正则的匹配陷阱:

const getAfterAtBeforeLastDot = (email) => {
  const afterAt = email.split("@")[1];
  return afterAt.slice(0, afterAt.lastIndexOf("."));
};

// 测试
console.log(getAfterAtBeforeLastDot("foo@bar.com")); // "bar"
console.log(getAfterAtBeforeLastDot("foo@mailinator.co.uk")); // "mailinator.co"

为什么原正则会失效?

你原来用的.*?是非贪婪匹配模式,它会尽可能少地匹配字符,所以碰到第一个.就会停止匹配,自然在多域名的情况下只能拿到第一个.之前的片段啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:40:46