如何编写可从不同格式字符串中统一提取邮箱的正则表达式
解决方案
有两种简单的实现方式,都可以统一从同一个位置读取匹配结果:
方案1:单捕获组通用正则(兼容性最好)
核心逻辑是优先匹配尖括号包裹的内容,没有尖括号就匹配整个字符串里的邮箱,所有结果统一从第1个捕获组读取:
正则表达式:/^(?:.*<)?([^<>\s]+@[^<>\s]+)(?:>)?$/
测试代码:
const emailRegex = /^(?:.*<)?([^<>\s]+@[^<>\s]+)(?:>)?$/; // 测试用例 const testCases = [ "torvalds@linux.org", "Elon <42069@tesla.com>", "Suzzy@Typo.com <suzzy@peppapig.com>" ]; testCases.forEach(item => { const result = item.match(emailRegex)?.[1]; console.log(result); });
输出结果:
torvalds@linux.org 42069@tesla.com suzzy@peppapig.com
方案2:命名捕获组(可读性更高)
如果你的运行环境支持ES2018及以上规范,可以用同名命名捕获组,直接从groups.email读取结果,不需要记捕获组序号:
正则表达式:/^(?:(?<email>[^<>\s]+@[^<>\s]+)|.*<(?<email>[^<>\s]+@[^<>\s]+)>)$/
测试代码:
const emailRegex = /^(?:(?<email>[^<>\s]+@[^<>\s]+)|.*<(?<email>[^<>\s]+@[^<>\s]+)>)$/; const testCases = [ "torvalds@linux.org", "Elon <42069@tesla.com>", "Suzzy@Typo.com <suzzy@peppapig.com>" ]; testCases.forEach(item => { const result = item.match(emailRegex)?.groups?.email; console.log(result); });
输出结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者noisy
相关产品推荐
相关产品推荐

