用户名的正则表达式

时间:2010-05-17 05:39:26

标签: regex

我需要有关正则表达式的帮助,条件如下(4):

  1. 以a-z
  2. 开头
  3. 以a-z0-9结尾
  4. 允许使用3个特殊字符,例如._-
  5. (3)中的字符必须后跟字母数字字符,并且(3)中的任何字符都不能跟随。
  6. 不知道该怎么做。任何帮助都会受到赞赏,包括样本和一些解释。

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)

基本上是这样的:

  1. [a-z]开始。
  2. 允许首次投放[a-z0-9]几次。 1)
  3. 允许
    • 最多一个[._-],然后是
    • [a-z0-9]
    • 中的至少一个
    • 三次或更少。
  4. [a-z0-9]结尾(隐含在上文中)。
  5. 哪个收益率:

    ^[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

在任何人说“效率低下”之前,请按照预期用途对其进行分析。还要注意,我并没有完全放弃使用正则表达式,它们是一件很棒的事情。