如何构建特殊字符不可紧跟句号的邮箱验证正则表达式?
邮箱验证正则表达式优化方案
现有正则及已实现规则
当前使用的正则表达式:
(?!^.*([._%+$-])\1+.*$)^[a-zA-Z0-9][a-zA-Z0-9._%+$-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,7}$
已满足以下验证规则:
- 禁止连续句号(如
customer@yahoo..com为无效) - 禁止用户名以特殊字符开头(如
#customer@yahoo.com为无效) - 禁止用户名包含连续两个特殊字符(如
cu$$tomer@yahoo.com为无效) - 域名后缀长度至少为2位(如
customer@yahoo.c为无效) - 域名后缀长度最多为7位(如
customer@yahoo.commmmmmm为无效)
待解决问题
需要新增规则:用户名中的特殊字符不可紧跟在句号之后(如customer.name.#name2@yahoo.com为无效),之前尝试添加的负向预查未生效,尝试的正则如下:
(?!^.*([._%+-])\1+.*$)(?!^.*(.)\2+([._%+-])$)^[a-zA-Z0-9][a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,7}$
解决方案
你之前添加的第二个负向预查逻辑错误,未命中“句号后紧跟特殊字符”的场景。只需新增一个匹配\.[._%+$-]模式的负向预查即可解决问题。
优化后的正则表达式
(?!^.*([._%+$-])\1+.*$)(?!^.*\.[._%+$-].*$)^[a-zA-Z0-9][a-zA-Z0-9._%+$-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,7}$
规则解释
(?!^.*([._%+$-])\1+.*$):保留原逻辑,禁止连续重复的特殊字符(含连续句号)(?!^.*\.[._%+$-].*$):新增负向预查,确保用户名部分不会出现“句号紧跟特殊字符”的组合- 主体匹配逻辑不变:保证用户名以字母/数字开头,域名及后缀符合长度要求
测试验证
- 有效示例:
customer.name@yahoo.com、user+tag_name@domain.co.uk - 无效示例:
customer.name.#name2@yahoo.com(句号后紧跟特殊字符)cu$$tomer@yahoo.com(连续特殊字符)#customer@yahoo.com(特殊字符开头)customer@yahoo..com(连续句号)customer@yahoo.c(后缀长度不足2)customer@yahoo.commmmmmm(后缀长度超过7)
内容的提问来源于stack exchange,提问作者Aroff
相关产品推荐
相关产品推荐

