我正在尝试根据以下规则使用Java验证用户名:
我用来执行验证的正则表达式为^[a-z]+\.?[a-z0-9]+$
这很好用(可能有更好的方法),但是现在我要允许用户名长度在3到10个字符之间。我尝试使用{3,10}
的任何地方,例如^([a-z]+\.?[a-z0-9]+){3,10}$
,验证失败。我使用的是出色的visual regex tool和online regex tester。
代码本身非常简单;我正在Java 8中使用String类的matches方法。 john.doe 通过了正则表达式和长度验证,但 j.doe 没有。 >
根据所选答案进行更新:
考虑到正则表达式的复杂性,Java代码可能有点不言自明:
private static final String PATTERN_USERNAME_REGEX = new StringBuilder()
// the string should contain 3 to 10 chars
.append("(?=.{3,10}$)")
// the string should start with a lowercase ASCII letter
.append("[a-z]")
// then followed by zero or more lowercase ASCII letters or/and digits
.append("[a-z0-9]*")
// an optional sequence of a period (".") followed with 1 or more lowercase ASCII letters
// or/and digits (that + means you can't have . at the end of the string and ? guarantees
// the period can only appear once in the string)
.append("(?:\\\\.[a-z0-9]+)?")
.toString();
答案 0 :(得分:4)
您要寻找的正则表达式是
^(?=.{3,10}$)[a-z][a-z0-9]*(?:\.[a-z0-9]+)?$
在Java中,
s.matches("(?=.{3,10}$)[a-z][a-z0-9]*(?:\\.[a-z0-9]+)?")
请参见regex demo。
详细信息
^
-字符串的开头(无需在String#matches
中使用)(?=.{3,10}$)
-字符串应包含3到10个字符[a-z]
-小写的ASCII字母[a-z0-9]*
零个或多个小写ASCII字母或数字
(?:\.[a-z0-9]+)?
-.
的可选序列,后跟1个或多个小写ASCII字母或数字,(+
表示您不能在.
字符串的末尾,?
保证.
在字符串中只能出现一次)$
-字符串结尾(无需在String#matches
中使用)