你可以试试这个:
^(?=.{5,10}$)(?!.*[._-]{2})[a-z][a-z0-9._-]*[a-z0-9]$
Run Code Online (Sandbox Code Playgroud)
这使用前瞻来强制用户名必须包含5到10个字符(?=.{5,10}$),并且3个特殊字符中没有一个连续出现两次(?!.*[._-]{2}),但总体而言它们可以出现任意次数(Konrad以不同的方式解释它,因为3个特殊字符最多可出现3次).
这是Java中的测试工具:
String[] test = {
"abc",
"abcde",
"acd_e",
"_abcd",
"abcd_",
"a__bc",
"a_.bc",
"a_b.c-d",
"a_b_c_d_e",
"this-is-too-long",
};
for (String s : test) {
System.out.format("%s %B %n", s,
s.matches("^(?=.{5,10}$)(?!.*[._-]{2})[a-z][a-z0-9._-]*[a-z0-9]$")
);
}
Run Code Online (Sandbox Code Playgroud)
这打印:
abc FALSE
abcde TRUE
acd_e TRUE
_abcd FALSE
abcd_ FALSE
a__bc FALSE
a_.bc FALSE
a_b.c-d TRUE
a_b_c_d_e TRUE
this-is-too-long FALSE
Run Code Online (Sandbox Code Playgroud)
所以基本上:
[a-z].[a-z0-9],几次.1)[._-],其次是[a-z0-9][a-z0-9](隐含在上面).产量:
^[a-z][a-z0-9]*([._-][a-z0-9]+){0,3}$
Run Code Online (Sandbox Code Playgroud)
但请注意,这可能会导致用户名只有一个字符.
1)(由@codeka发布)
尝试:
^[a-zA-Z](([\._\-][a-zA-Z0-9])|[a-zA-Z0-9])*[a-z0-9]$
Run Code Online (Sandbox Code Playgroud)
1)^ [a-zA-Z]:开始
2)(([[._-] [a-zA-Z0-9])| [a-zA-Z0-9])*:任意数量的字母数字或特殊字符,后跟字母数字
3)[a-z0-9] $