常用正则内含 1 场可玩狩猎

邮箱正则:可直接复制、真正好用的写法

三个可直接复制的邮箱正则(简单、实用和严格),各自适合什么场景,以及会把真实地址拒之门外的常见错误。

Regex Hunter 标志

· 阅读约 3 分钟 · 更新于

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

抓住

  • ana@site.com
  • x+t@site.io
  • jo@mail.co.uk

放过

  • ana@example
  • @site.com
  • a@@b.io

01可直接复制的邮箱正则

正则 适用场景
^\S+@\S+$ 简单:快速的基本检查,比如过滤日志或搜索框。
^[^\s@]+@[^\s@]+\.[^\s@]+$ 实用(我们推荐):用于注册和联系表单,所有真实地址都能通过,常见的输入错误则通不过。
^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$ 严格:你需要接受的内容与浏览器 type="email" 字段完全一致。

在沙盒中用你自己的地址试试其中任何一个,或者用“格式校验”练习包练一练。本文其余部分会解释为什么实用版是正确的默认选择。

搜索“email regex”,你会找到各种长度的正则,从十个字符到几千个字符不等。有人试图把完整的电子邮件标准写进一个正则表达式,结果出了名地难以读懂。

好消息是:这些你都用不着。下面会介绍我们推荐的正则、为什么更严格的正则带来的麻烦比它防住的还多,以及应该怎么做。每个示例都可以实时编辑,修改正则看看有什么变化。

02为什么不存在“完美”的邮箱正则

邮箱地址格式允许的内容远比大多数人想象的多。下面这些都是合法的:

  • x+newsletter@site.io(加号标签,用于过滤邮件)
  • j.doe@mail.co.uk(子域名,加上两段式的国家后缀)
  • ana@studio.photography(很长的顶级域名)
  • josé@exemplo.com.br(非英文字母,支持国际化地址的邮件服务器可以处理)

而且正则无法告诉你一个地址是否存在。ana@example.com 格式完美,却仍然可能被退信。唯一真正的检查方式,是发一封邮件,请对方点击里面的链接。

所以正则的任务比看起来要小:在发出那封邮件之前,拦住明显的输入错误。

03我们推荐的正则

匹配9/9 符合预期
/^[^\s@]+@[^\s@]+\.[^\s@]+$/

应当匹配5/5

  • ana@example.com
  • j.doe@mail.co.uk
  • x+tag@site.io
  • ana@studio.photography
  • josé@exemplo.com.br

不应匹配4/4

  • ana@example
  • ana@@example.com
  • ana @example.com
  • @example.com
在沙盒里试试
一段不含空白和 @ 的内容,然后是一个 @,再是至少包含一个点的域名。现实中的每个地址都能通过,常见的输入错误则不行。

分成四部分来读:

  1. ^[^\s@]+ 一个或多个既不是空白也不是 @ 的字符
  2. @ 恰好一个 @ 符号
  3. [^\s@]+\. 域名,然后是一个字面上的点
  4. [^\s@]+$ 域名的其余部分,一直到结尾

它简短、易读,而且不会拒绝任何拥有真实地址的人。

04错误 1:忘记锚点

没有 ^ 和 $,正则只需要在文本某处找到一段像邮箱的内容就行:

匹配2/2 符合预期
/\S+@\S+/
  • ana@example.com
  • not an email: a@b c
在沙盒里试试
最后一行能通过,因为其中出现了“a@b”。加上 ^ 和 $ 后,整个输入都必须是邮箱地址。

05错误 2:过于严格

网上最常见的邮箱正则就像下面这个。它看起来很严谨,却把真实用户挡在了门外:

匹配4/4 符合预期
/^[\w.]+@\w+\.[a-z]{2,4}$/

应当匹配1/1

  • ana@example.com

不应匹配3/3

  • j.doe@mail.co.uk
  • x+tag@site.io
  • ana@studio.photography
在沙盒里试试
这里每一行都是合法地址,而这个正则只接受第一行。

它同时在三个地方出错:

  • 点前面的 \w+ 只允许一段域名,所以 mail.co.uk 无法通过。
  • [\w.] 里没有 +,所以带加号标签的地址无法通过。
  • [a-z]{2,4} 假设顶级域名都很短。实际上有几百个更长的:.photography、.software、.museum。

即使是更严谨的版本 ^[\w.+-]+@[\w-]+(\.[\w-]+)+$,仍然会拒绝 josé@exemplo.com.br,因为在大多数引擎中 \w 只覆盖英文字母。每拒绝一个真实地址,就少一个注册用户。而漏过去的输入错误,反正也会被确认邮件发现。

06浏览器用的是什么

HTML 的 <input type="email"> 用自己的正则检查地址,这个正则发布在 HTML 标准中:

正则133 字符
/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
在沙盒里试试
HTML 标准中的正则。它允许 user@localhost(不需要点),并拒绝 @ 前面出现非英文字母。

如果你在表单上使用 type="email",浏览器已经替你做了这项检查。对前端来说,这通常就够了。

07正则高尔夫版本

校验和高尔夫的目标不同。校验器必须对任何输入都安全。高尔夫棋盘只需要区分这些单词,所以你可以只看最小的差异。

下面每个怪物都在 @ 前面紧挨着一个字母,并且在它后面某处有一个点。每个无辜者都违反了其中一条规则:

可玩狩猎标准杆 8

抓住看起来像邮箱的字符串,放过格式有误的。

目标 · 抓住 0/4

  • ana@site.com目标
  • bo@mail.io目标
  • x.y@z.org目标
  • k@q.dev目标

无辜词 · 误抓 0

  • ana@site无辜
  • @mail.io无辜
  • bo@@z.org无辜
  • site.com无辜
  • a.b@c无辜

输入正则——棋盘会实时更新。

在沙盒里试试
喜欢吗?每天都有新的狩猎。玩今天的狩猎

08检查清单

  • 使用 ^[^\s@]+@[^\s@]+\.[^\s@]+$ 或浏览器的 type="email"。
  • 校验整个输入时,一定要用 ^ 和 $ 锚定。
  • 不要把顶级域名限制在 2 到 4 个字母。
  • 不要拒绝 +、域名中多出的点或非英文字母。
  • 发送确认邮件。这是唯一能证明地址可用的测试。

09继续练习