正则表达式限制重复 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}
我有一个在 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}