如何创建符合特定特殊字符规则的邮箱验证正则表达式?
邮箱正则表达式问题解析与修正
需求说明
@符号之前仅允许.和_作为特殊字符;@符号之后仅允许-和.作为特殊字符。
原正则表达式
^[A-Za-z0-9]+(\.[A-Za-z0-9]+)*(\_[A-Za-z0-9]+)*@[A-Za-z0-9]+(\-[A-Za-z0-9]+)*(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$
正确邮箱格式示例
- mymail@gmail.com
- my_mail@gmail.com
- my_mail.mail_mail@gmail.com
- my.mail_mail.mail@gmail.com
- my.mail_gmail.mail@gmail.com
- mymail@gmail.co.id
- mymail@gm-ail.co.id
错误邮箱格式示例
- .mail@gmail
- mail.@gmail
- mail_@gmail
- _mail@gmail
- mail@-gmail
- mail@gmail-
当前存在的问题
原正则无法匹配部分符合要求的邮箱,例如:
- mail.mail_mail.mail@gmil.com
- mail_mail.mail@gmial.com
问题出在@之前的正则片段:
^[A-Za-z0-9]+(\.[A-Za-z0-9]+)*(\_[A-Za-z0-9]+)*
修改后的正则表达式
^[a-zA-Z0-9]+([._][a-zA-Z0-9]+)*@[A-Za-z0-9]+(\-[A-Za-z0-9]+)* (\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$
修正有效性判断
修改后的正则可以解决原问题,但需要去掉@后部分的多余空格,最终正确正则如下:
^[a-zA-Z0-9]+([._][a-zA-Z0-9]+)*@[A-Za-z0-9]+(\-[A-Za-z0-9]+)*(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$
原因说明
原@前的正则逻辑存在局限:它要求先连续出现任意次数的.+字符组合,再连续出现任意次数的_+字符组合,无法处理.和_交替出现的场景(比如mail.mail_mail.mail这种穿插使用两种符号的格式)。
修改后的^[a-zA-Z0-9]+([._][a-zA-Z0-9]+)*将.和_合并到同一个字符组[._]中,允许两种符号交替跟随字符出现,完全覆盖所有符合要求的本地部分格式,包括之前无法匹配的案例。
内容的提问来源于stack exchange,提问作者lauwis
相关产品推荐
相关产品推荐

