Regex 用户名的正则表达式
我需要有关正则表达式的帮助,条件(4)如下:Regex 用户名的正则表达式,regex,Regex,我需要有关正则表达式的帮助,条件(4)如下: 从a-z开始 以a-z0-9结束 允许3个特殊字符,如_- (3)中的字符后面必须跟字母数字字符,并且(3)中的任何字符都不能跟在后面 不知道怎么做。非常感谢您的帮助,请提供示例和一些解释。试试: ^[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的特
^[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]$因此基本上:
[a-z]
开始[a-z0-9]
。(一)- 最多一个
,后跟[.-]
- 至少一个
[a-z0-9]
- 三次或更少
[a-z0-9]
结尾(如上所述)^[a-z][a-z0-9]*([._-][a-z0-9]+){0,3}$
但请注意,这可能导致用户名只有一个字符
1) (由@codeka发布)您可以尝试以下方法:
^(?=.{5,10}$)(?!.*[._-]{2})[a-z][a-z0-9._-]*[a-z0-9]$
这使用lookaheads强制要求用户名必须有5到10个字符(?=.{5,10}$)
,并且这3个特殊字符在一行中不会出现两次(?!.[.\u-]{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]$")
);
}
这张照片是:
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
另见
- ,及
- 好吧,因为我想成为。。。我一个正则表达式不需要对所有正则表达式进行规则化——对于九个正则表达式中的一个,请参见。(不过,在这种情况下,已经有了一些不错的答案;我只是指出了一种稍微不同的方法。)
现在想象一下,您只允许一个.,u或-total(也许我误解了最初的要求,耸耸肩);这很容易添加(并可视化):
&&n.replace(/[^.\u-]/g,”)。长度似乎过于复杂了!你打算如何向最终用户解释规则?什么风格的regexp?Perl?Javascript?JAVANet?我一直在想,为什么开发人员要限制密码字符?我可以说“必须至少有这么复杂”,但“只能有这么复杂”让我的大脑糊涂了。@Erik:OP要求的是用户名,而不是密码。对于用户名,限制很有意义。可能重复+1很好。而{0,3}
的解释也是非常合理的。长度可以通过(?=.{8})
向前看来强制执行。@polygene:整洁!但是,最好在你的答案中写上。分隔符不应该是可选的[.-]?
应该是[.-]
@Alan Moore:是的,结果表达式更有意义。您没有声明只允许使用[-0-9A-Za-z..\u-]
。因此,目前aaaааaaa
是一个有效的用户名。(注意中间的三个西里尔字母< > <代码> s。
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