如何用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
相关产品推荐
相关产品推荐

