正则表达式限制重复 class 个子字符

Regex limit repeated class sub character

我有一个在 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. 这样的错误电子邮件地址我已经尝试对 class [a-zA-Z0-9\.\_\-] 应用限制器,但这会导致它在有效电子邮件地址上失败。

如有任何想法,我们将不胜感激。

为锚定开始的两个点添加负面前瞻:

^(?!.*\.\.)[a-zA-Z0-9._-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,5}(\.[a-zA-Z]{2,5}){0,1}

此表达式 (?!.*\.\.) 表示以下文本 包含 2 个连续的点。

顺便说一句,大多数字符在字符class内时不需要转义,包括字符._-,即[a-zA-Z0-9\.\_\-][a-zA-Z0-9._-](需要注意的是破折号出现在第一个或最后一个时是字面上的破折号)。


使用 lookaheads 可以轻松添加整体约束,您可以轻松添加更多约束,例如,要求总长度至少为 10 个字符,在前面添加 (?=.{10})

^(?=.{10})(?!.*\.\.)[a-zA-Z0-9\.\_\-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,5}(\.[a-zA-Z]{2,5}){0,1}