我有一个用于Java的电子邮件地址过滤正则表达式。除了尝试限制电子邮件地址的用户名部分中的重复点之外,它大部分都有效。
我使用的正则表达式(删除了转义)是[a-zA-Z0-9\.\_\-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,5}(\.[a-zA-Z]{2,5}){0,1}
这并没有发现错误的电子邮件地址,例如test..test@test.com.
我尝试将限制因素应用于班级[a-zA-Z0-9\.\_\-]
但导致其在有效的电子邮件地址上失败。
任何想法都会非常感激。
答案 0 :(得分:2)
为两个锚点开始添加负向前瞻:
^(?!.*\.\.)[a-zA-Z0-9._-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,5}(\.[a-zA-Z]{2,5}){0,1}
此表达式(?!.*\.\.)
表示不包含2个连续点的以下文字。
顺便说一下,当你在字符类中时,你不需要转义大多数字符,包括字符._-
,即[a-zA-Z0-9\.\_\-]
与[a-zA-Z0-9._-]
相同(需要注意的是,破折号是第一个或最后一个出现的文字破折号。)
使用前瞻可以轻松添加整体约束,并且您可以轻松添加更多内容,例如,要求总长度至少为10个字符,将(?=.{10})
添加到前面:
^(?=.{10})(?!.*\.\.)[a-zA-Z0-9\.\_\-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,5}(\.[a-zA-Z]{2,5}){0,1}