我正在编写一个正则表达式来验证UserName。
以下是规则:
以下是我的尝试:
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
任何人都有任何想法?
谢谢!
答案 0 :(得分:3)
您可以使用前瞻性正则表达式进行所有检查:
^[a-zA-Z](?!.*\.\.)[a-zA-Z.\d]{5,19}$
[a-zA-Z.\d]{5,19}
因为我们在开始时已经匹配了一个字符[a-zA-Z]
,因此总长度在{6,20}
(?!.*\.\.)
将断言失败
等效的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])(?!.*\.\.)(^.*$)