邮箱验证正则表达式

先给结论,再说清边界:下面这个模式负责拦住拼写错误,确认邮件负责拦住其余一切。生产系统真正在用的就是这套组合。

🎙️ 发布并录制于: ·

实用的邮箱模式

这个模式检查的是有用的外形:几个允许的字符,一个 at 符号,一个域名,再加一个点后面的后缀。它是有意做成错字过滤器的,不是能成功投递的证明。记得让它匹配整个输入,否则一段看着合法的碎片会把周围的垃圾一起带过关。

^[\w.+-]+@[\w-]+\.[\w.-]+$

# read it: one-or-more of [letters/digits/_/./+/-]  @
# domain chunk  .  rest of domain (dots allowed)
# anchored ^...$ because validation must match the WHOLE string

Python、JavaScript,以及真正重要的测试

先把用户不小心带上的首尾空格去掉,然后在两种语言里跑同一个整串检查。把一份很短的测试清单放在模式旁边。正向用例负责保护真实存在的地址,比如带加号标签的收件箱;反向用例负责抓出少了一段、混进空格、分隔符重复,以及多了一个 at 符号这些情况。

# Python
import re
EMAIL_RE = re.compile(r"^[\w.+-]+@[\w-]+\.[\w.-]+$")
def looks_like_email(s):
    return bool(EMAIL_RE.match(s.strip()))

// JavaScript
const EMAIL_RE = /^[\w.+-]+@[\w-]+\.[\w.-]+$/;
const looksLikeEmail = s => EMAIL_RE.test(s.trim());
✓ should match:
[email protected]
[email protected]
 [email protected]

✗ should NOT match:
ada@example        (no TLD)
@example.com       (no local part)
ada @example.com   (space)
ada@@example.com
"ada"@example..com
不要拒绝加号
[email protected] 是合法的,而且是有意为之。很多人用标签给邮件分类,也用它查到底是谁泄露了自己的地址。一个对带标签地址弹出 “请输入有效的邮箱地址” 的表单,就是写错了;请把加号留在允许的字符集里。

验证、确认邮件,和提取

别去堆那个号称完全符合标准的巨型模式。各家邮件系统在边界情况上本来就意见不一,而语法也回答不了这个信箱到底存不存在。用短模式拦住明显的错误,然后发一封确认邮件。要从一整段文字里找地址,用同一个核心外形,只是不再要求它占满整个字符串。

为何不用“完美”的 RFC 5322 模式
规范允许引号里带空格、允许注释,还有其他很罕见的写法。一个看着完整的正则会长到几千个字符,而且照样证明不了这个信箱能收信。生产上真正有效的做法很朴素:简单校验加一条确认链接;不要把注册流程变成抠标准条文的比赛。
# unanchored — finding, not validating:
[\w.+-]+@[\w-]+\.[\w.-]+

re.findall(r"[\w.+-]+@[\w-]+\.[\w.-]+", big_text)
# validation = anchored ^...$. extraction = unanchored. never mix.
一个真实的故障现象
如果校验器把 noise [email protected] noise 也收下了,那它在搜索,不是在校验。要求整串匹配。反过来,如果提取器从一整段文字里什么都没找到,先看看是不是把锚定的校验模式拿去复用了。
📚 本页属于正则表达式系列。五个核心概念、贪婪匹配的坑,以及何时干脆不用正则,均配音频:10 分钟学会正则表达式 →

Tell me what missed

A correction is more useful than a compliment. This goes straight to the person who writes SwiftGrasp.

Was this page useful?
0/1000

Please do not include passwords, private keys, or personal information.