2012-01-15 96 views
1

我对创建复杂RegEx并不太擅长。我复制从另一个源以下,为了一定程度的密码限制强制实施的应用程序:正则表达式字符长度限制失败单元测试

// 8 to 20 char, one digit, one letter 
public static final String GOOD_PASSWORD_REGEX = 
    "(^(?=.{8,20})(?=.*[a-zA-Z])(?=.*[\\d]).*$)"; 

同时,该单元测试失败:

String tooLongPassword = "asdfghjkl123456789qwe"; // 21 characters 
assertFalse(tooLongPassword.matches(ValidationContants.GOOD_PASSWORD_REGEX)); 

这是类似少数之一我正在针对此RegEx运行测试用例,其中包括没有字母,数字等的其他测试用例,其余所有通过。

请问哪里出错?

回答

1

在您的版本中,lookahead断言仅检查它是否可以匹配字符串开始处的8-20个字符长度的字符串。这当然也成功了一串长度为21以上的字符串。

所以$需要成为先行的一部分:

// 8 to 20 char, one digit, one letter 
public static final String GOOD_PASSWORD_REGEX = 
    "(^(?=.{8,20}$)(?=.*[a-zA-Z])(?=.*\\d).*$)"; 

但是,为什么在密码强加的长度最大?另外[]快捷方式\d附近是不必要的。

而且,因为你只需要在正则表达式来验证密码,而不是实际返回它(因为它的成立,现在它会返回整个输入字符串的方式),可以缩短正则表达式:

"^(?=.{8,20}$)(?=.*[a-zA-Z])(?=.*\\d)"