规范
规范定义比较复杂,甚至支持注释。
我简化一下(去掉注释,去掉双引号,去掉 [IPv4]
/ [IPv6]
/ 主机名
做域):
- 格式:
域内部分@域
-
域内部分:
-
长度不超过 64
- 大小写字母 + 数字(62)
-
ASCII 标点符号(19)
!#$%&'*+-/=?^_`{|}~
-
可以加入点号(
.
)隔开,不放首尾,不连续出现 -
域名
-
每一级域名 1 - 63 个字符,总长度不超过 253
这个限制和 DNS 报文设计有关
国际化域名转换成 Punycode 之后也必须遵守这个约定 - 允许包含数字、字母(大小写不敏感)和短横线(
-
) - 短横线不能出现在首尾位置
实践
实际上的邮件地址会更加简单:
- 长度限制
- QQ 邮箱 3 - 18
- 网易邮箱 6 - 18
- Gmail 6 - 30
- 新浪邮箱 4 - 16
- 字符限制:字母数字 +
.-_
- 一般大小写不敏感
- 连字符(
.-_
)不可连续出现- 网易免费邮箱只支持下划线,网易 VIP 邮箱支持点和下划线
- Gmail 只支持点和加号
- 在实际投递中,点和加号会被忽略
- 点可以用作单词风格
- 加号通常用做来信归类,比如注册淘宝时
+taobao
,订阅开发者头条时+toutiao
,相关邮件就方便搜索归类。
- 部分邮箱不支持全数字(别有用途,或是避免 QQ 号冲突,或是避免手机号冲突)
- 开头结尾字符限制:
- 字母数字开头 + 字母数字结尾
- 字母开头 / 字母数字结尾
正则表达式
以规范为准,参考真实场景下的实践:
域内部分:
/[a-z0-9]+([.-_#][a-z0-9]+)+/;
域名部分:
/[a-z0-9]+(-[a-z0-9]+)?(\.[a-z0-9]+(-[a-z0-9]+)?)+/;
汇总在一起就是:
/^[a-z0-9]+([.-_#][a-z0-9]+)+@[a-z0-9]+(-[a-z0-9]+)?(\.[a-z0-9]+(-[a-z0-9]+)?)+$/;