Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用户名的正则表达式_Regex - Fatal编程技术网

Regex 用户名的正则表达式

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的特

我需要有关正则表达式的帮助,条件(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的特殊字符的任意数字

    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