正则表达式实现:禁止邮箱用户名首尾出现._-特殊字符
邮箱校验正则优化实现
你原有正则的问题出在用户名部分的匹配规则[a-zA-Z0-9._-]+没有对特殊字符的位置做限制,允许.、_、-出现在首尾位置,我们只需要重写用户名段的匹配逻辑即可。
最终可用正则
const emailValidateReg = /^[a-zA-Z0-9]+(?:[._-][a-zA-Z0-9]+)*@[a-zA-Z0-9]+\.[a-zA-Z]{2,}$/
规则编写逻辑
整个正则完全匹配你提出的校验要求,逐段逻辑如下:
^[a-zA-Z0-9]+:匹配用户名开头,强制要求首字符必须是大小写字母或数字,从根源上禁止.、_、-出现在用户名首位(?:[._-][a-zA-Z0-9]+)*:匹配用户名中间部分,规则为:- 每出现一次
.、_、-三类特殊字符,后面必须紧跟至少1个字母/数字,从规则上杜绝特殊字符出现在用户名末尾的可能,同时自动拦截连续特殊字符的非法格式(比如na..me@xx.com这类不符合常规邮箱规范的格式也会被判定无效) - 非捕获分组
(?:)仅做规则匹配,不额外缓存分组内容,匹配性能更高 - 分组后的量词
*代表该段规则可以出现0次或多次:既支持纯字母数字的用户名(比如user123@xx.com),也支持中间穿插多组特殊字符的用户名(比如user.name_01-test@xx.com)
- 每出现一次
@[a-zA-Z0-9]+\.[a-zA-Z]{2,}$:保留你原有域名段的匹配逻辑,@后匹配至少1段字母/数字组成的域名主体,加.后匹配至少2位的域名后缀。
测试用例匹配结果
对照你给出的样例逐一校验,结果完全符合预期:
- 无效样例(全部匹配失败):
_name.name_@email.com-name.name-@email.comname.@email.comname_@email.comname-@email.com.name@email.com_name@email.com-name@email.com
- 有效样例(全部匹配成功):
name.name@email.comname_name@email.comname-name@email.com
内容的提问来源于stack exchange,提问作者Mahi
相关产品推荐
相关产品推荐

