具有长度范围的UserName的Java正则表达式

时间:2016-04-18 14:51:37

标签: java regex validation username

我正在编写一个正则表达式来验证UserName。

以下是规则:

  • 长度:6 - 20个字符
  • 必须以字母a-zA-Z
  • 开头
  • 可以包含a-zA-Z0-9和点(。)
  • 不能有2个连续的点

以下是我的尝试:

public class TestUserName {

    private static String USERNAME_PATTERN = "[a-z](\\.?[a-z\\d]+)+";
    private static Pattern pattern = Pattern.compile(USERNAME_PATTERN, CASE_INSENSITIVE);

    public static void main(String[] args) {
        System.out.println(pattern.matcher("user.name").matches()); // true
        System.out.println(pattern.matcher("user.name2").matches()); // true
        System.out.println(pattern.matcher("user2.name").matches()); // true

        System.out.println(pattern.matcher("user..name").matches()); // false
        System.out.println(pattern.matcher("1user.name").matches()); // false
    }
}

我使用的模式很好但没有长度限制。

我试图将{6,20}约束附加到模式但它失败了。

"[a-z](\\.?[a-z\\d]+)+{6,20}" // failed pattern to validate length

任何人都有任何想法?

谢谢!

4 个答案:

答案 0 :(得分:3)

您可以使用前瞻性正则表达式进行所有检查:

^[a-zA-Z](?!.*\.\.)[a-zA-Z.\d]{5,19}$
  • 使用[a-zA-Z.\d]{5,19}因为我们在开始时已经匹配了一个字符[a-zA-Z],因此总长度在{6,20}
  • 范围内
  • 如果有2个连续的点
  • ,则负前瞻(?!.*\.\.)将断言失败

等效的Java模式将是:

Pattern p = Pattern.compile("^[a-zA-Z](?!.*\\.\\.)[a-zA-Z.\\d]{5,19}$");

答案 1 :(得分:3)

使用负面向前看以防止出现双点:

"^(?!.*\\.\\.)(?i)[a-z][a-z\\d.]{5,19}$"
  • (?i)表示不区分大小写(因此[a-z]表示[a-zA-Z]
  • (?!.*\\.\\.)表示其中任何地方都没有两个连续点

其余的很明显。

请参阅live demo

答案 2 :(得分:1)

我会使用以下正则表达式:

^(?=.{6,20}$)(?!.*\.\.)[a-zA-Z][a-zA-Z0-9.]+$

(?=.{6,20}$)正向前瞻确保文字包含6到20个字符,而(?!.*\.\.)否定前瞻确保文字在任何时候都不会包含..

答案 3 :(得分:1)

这也足够了(仅用于匹配)

(?=^.{6,20}$)(?=^[A-Za-z])(?!.*\.\.)

对于捕获,匹配的模式,您可以使用

(?=^.{6,20}$)(?=^[A-Za-z])(?!.*\.\.)(^.*$)