Java中用户名的正则表达式(RegEx)

时间:2014-05-23 08:57:05

标签: java regex username

如何在Java中形成用户名字符串的RegEx?

练习中的规则:

  1. 只有3-10个字符。
  2. 只有' - ' z',' A' - ' Z',' 1' - & #39; 9',' _'和'。'是允许的。
  3. ' _'和'。'只能出现0到2次。
    • "abc_._" = false
    • "abc..." = false
    • "abc__" = true
    • "abc.." = true
    • "abc_." = true
  4. 如果我不使用正则表达式,那将更容易。


    在不考虑' 1' - ' 9'的情况下,我尝试了以下RegEx,但它们无法使用。

    String username_regex = "[a-zA-Z||[_||.]{0,2}]{3,10}";
    String username_regex = "[a-zA-Z]{3,10}||[_||.]{0,2}";
    

    我的功能:

    public static boolean isUserNameCorrect(String user_name) {
        String username_regex = "[a-zA-Z||[_]{0,2}]{3,10}";
        boolean isMatch = user_name.matches(username_regex);
        return isMatch;
    }
    

    我应该使用什么RegEx?

    感谢您的关注。

4 个答案:

答案 0 :(得分:2)

如果我从CS课程中记得很清楚,那么可以创建一个单一的正则表达式以满足所有三个要求。所以,我会对每个条件进行单独检查。例如,此正则表达式检查条件1和2,并单独检查条件3。

private static final Pattern usernameRegex = Pattern.compile("[a-zA-Z1-9._]{3,10}");

public static boolean isUserNameCorrect(String userName) {
    boolean isMatch = usernameRegex.matcher(userName).matches();
    return isMatch && countChar(userName, '.')<=2  && countChar(userName, '_') <=2;
}

public static int countChar(String s, char c) {
    int count = 0;
    int index = s.indexOf(c, 0);
    while ( index >= 0 ) {
        count++;
        index = s.indexOf(c, index+1);
    }
    return count;
}
BTW,请注意允许您在Java中重用正则表达式的模式(性能增益,因为编译正则表达式代价很高)。

正则表达式无法做你想做的事情(再次,如果我记得很清楚)的原因是这个问题需要一个无上下文语法,而正则表达式是一个常规语法。 Ream more

答案 1 :(得分:1)

首先,||对于这个问题不是必需的,事实上并没有做你认为它做的事情。我之前只看到它在群组中用于正则表达式(例如,如果您想匹配HelloWorld,则匹配(Hello|World)(?:Hello|World) ,在这些情况下,您只使用一个|


接下来,让我解释为什么你尝试的每个正则表达式都不起作用。

String username_regex = "[a-zA-Z||[_||.]{0,2}]{3,10}";

字符类中的范围运算符不会被解释为范围运算符,而只会表示构成范围运算符的文字。此外,简单地组合嵌套字符类。所以这实际上等于:

String username_regex = "[a-zA-Z_|.{0,2}]{3,10}";

所以它会匹配以下3-10个部分的组合:a - zA - Z02{}.|_

那不是你想要的。


String username_regex = "[a-zA-Z]{3,10}||[_||.]{0,2}";

这将匹配3到10个a - zA - Z,后跟两个管道,然后是_,{{1 }或| 0到2次。也不是你想要的。


执行此操作的简单方法是将需求分为两部分,并根据这些部分创建两个正则表达式字符串:

  1. 只有3到10个字符,其中只有&#39; a&#39; - &#39;&#39;&#39; A&#39; - &#39; Z&#39;,&#39 ; 1&#39; - &#39; 9&#39;,&#39; _&#39;和&#39;。&#39;是允许的。
  2. &#39; _&#39;和&#39;。&#39;只能出现0到2次。
  3. 第一个要求非常简单:我们只需要创建一个包含所有有效字符的字符类,并对可以显示的字符数量进行限制:

    .

    然后我会验证&#39; _&#39;和&#39;。&#39;出现0到2次:

    "[a-zA-Z1-9_.]{3,10}"
    

    ".*[._].*[._].*"
    

    遗憾的是,我没有足够的经验来弄清楚单个正则表达式会是什么样子......但这些至少是可读的。

答案 2 :(得分:0)

请试试这个: [[A-Z] [0-9]的 [._] [[A-Z] [0-9] [._] [[A-Z] [0-9] *

尼科

编辑: 你是对的。然后几个正则表达式: Regex1:^ [\ w。] {3-10} $ Regex2:^ [[aZ] [0-9]] [_。]?[[aZ] [0-9]] [_。]?[[aZ] [0-9]] * $

我希望我什么也没忘记!

答案 3 :(得分:0)

可能不太优雅,但你可以试试这个:

^(([A-Za-z0-9\._])(?!.*[\._].*[\._].*[\._])){3,10}$

以下是解释:

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (                        group and capture to \1 (between 3 and 10
                           times (matching the most amount
                           possible)):
--------------------------------------------------------------------------------
    (                        group and capture to \2:
--------------------------------------------------------------------------------
      [A-Za-z0-9\._]           any character of: 'A' to 'Z', 'a' to
                               'z', '0' to '9', '\.', '_'
--------------------------------------------------------------------------------
    )                        end of \2
--------------------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
      .*                       any character except \n (0 or more
                               times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
      [\._]                    any character of: '\.', '_'
--------------------------------------------------------------------------------
      .*                       any character except \n (0 or more
                               times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
      [\._]                    any character of: '\.', '_'
--------------------------------------------------------------------------------
      .*                       any character except \n (0 or more
                               times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
      [\._]                    any character of: '\.', '_'
--------------------------------------------------------------------------------
    )                        end of look-ahead
--------------------------------------------------------------------------------
  ){3,10}                  end of \1 (NOTE: because you are using a
                           quantifier on this capture, only the LAST
                           repetition of the captured pattern will be
                           stored in \1)
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

这将满足您的上述要求。希望它有所帮助:)