我需要有关正则表达式的帮助,条件如下(4):
不知道该怎么做。任何帮助都会受到赞赏,包括样本和一些解释。
答案 0 :(得分:9)
你可以试试这个:
^(?=.{5,10}$)(?!.*[._-]{2})[a-z][a-z0-9._-]*[a-z0-9]$
这使用前瞻来强制用户名必须包含5到10个字符(?=.{5,10}$)
,并且3个特殊字符中没有一个连续出现两次(?!.*[._-]{2})
,但总体而言,它们可以显示任意数量的时代(康拉德对它的解释不同,因为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]$")
);
}
打印:
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
答案 1 :(得分:7)
基本上是这样的:
[a-z]
开始。[a-z0-9]
几次。 1) [._-]
,然后是[a-z0-9]
[a-z0-9]
结尾(隐含在上文中)。哪个收益率:
^[a-z][a-z0-9]*([._-][a-z0-9]+){0,3}$
但请注意,这可能会导致用户名只包含一个字符。
1)(由@codeka发布)
答案 2 :(得分:5)
试试:
^[a-zA-Z](([\._\-][a-zA-Z0-9])|[a-zA-Z0-9])*[a-z0-9]$
1)^ [a-zA-Z]:开始
2)(([。[ - ] [a-zA-Z0-9])| [a-zA-Z0-9])*:任意数量的alphanum,或特殊字符后跟alphanum
3)[a-z0-9] $
答案 3 :(得分:1)
好吧,因为我觉得自己是......我。一个正则表达式不需要统治它们 - 对于九个中的一个,请参阅nqueens。 (但是,在这种情况下,已经有一些很好的答案;我只是指出了一种稍微不同的方法。)
function valid(n) {
return (n.length > 3
&& n.match(/^[a-z]/i)
&& n.match(/[a-z0-9]$/i)
&& !n.match(/[._-]{2}/)
}
现在假设你只允许一个。,_或 - 总数(也许我误读了初始要求耸肩);这很容易添加(和可视化):
&& n.replace(/[^._-]/g, "").length <= 1
在任何人说“效率低下”之前,请按照预期用途对其进行分析。还要注意,我并没有完全放弃使用正则表达式,它们是一件很棒的事情。