先给结论,再说清边界:下面这个模式负责拦住拼写错误,确认邮件负责拦住其余一切。生产系统真正在用的就是这套组合。
🎙️ 发布并录制于: ·
这个模式检查的是有用的外形:几个允许的字符,一个 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先把用户不小心带上的首尾空格去掉,然后在两种语言里跑同一个整串检查。把一份很短的测试清单放在模式旁边。正向用例负责保护真实存在的地址,比如带加号标签的收件箱;反向用例负责抓出少了一段、混进空格、分隔符重复,以及多了一个 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] 是合法的,而且是有意为之。很多人用标签给邮件分类,也用它查到底是谁泄露了自己的地址。一个对带标签地址弹出 “请输入有效的邮箱地址” 的表单,就是写错了;请把加号留在允许的字符集里。别去堆那个号称完全符合标准的巨型模式。各家邮件系统在边界情况上本来就意见不一,而语法也回答不了这个信箱到底存不存在。用短模式拦住明显的错误,然后发一封确认邮件。要从一整段文字里找地址,用同一个核心外形,只是不再要求它占满整个字符串。
# 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 也收下了,那它在搜索,不是在校验。要求整串匹配。反过来,如果提取器从一整段文字里什么都没找到,先看看是不是把锚定的校验模式拿去复用了。