密码必须包含: 1个大写字母 1个较低的字母 1位数 1个特殊符号 最少8个符号
这是我的正则表达式:
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@_$%^&*-]).{8,}$
但是当我尝试使用密码验证时:Test_123它会返回false
这是我的代码:
public class PasswordCheck {
static Logger logger = Logger.getLogger(CommonHelper.class);
private static final String PASSWORD_PATTERN = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@_$%^&*-]).{8,}$";
private Pattern pattern;
private Matcher matcher;
public PasswordCheck() {
pattern = Pattern.compile(PASSWORD_PATTERN);
}
/**
* Validate password with regular expression
*
* @param password
* password for validation
* @return true valid password, false invalid password
*/
public boolean validate(final String password) {
matcher = pattern.matcher(password);
System.out.println(password);
System.out.println(matcher.matches());
return matcher.matches();
}
}
我只是尝试使用相同的文本在验证函数中设置新的String:Test_1523并返回true,但是当我通过rest服务发布此字符串并将其传递给函数时返回false
答案 0 :(得分:2)
无论您是使用正则表达式还是其他方法来验证这些字符串 - 但请:不要将所有内容都压缩成一段代码或正则表达式。
您希望创建易于阅读和维护的代码;和一个包含这么多"编码的正则表达式#34;知识不会有帮助。我不止一次使用像
这样的东西interface PasswordValidator {
boolean isValid(String input);
String getErrorMessage();
}
然后创建实现这种接口的各种类。最后,您只需为每个实现类创建一个对象;你可以将它们放入一些静态列表中。然后验证意味着:只运行该列表中的所有验证器对象。如果失败,您可以直接向用户询问错误消息(这样您就可以准确地告诉他缺少的内容;而不是再次将整个规则集抛给他)。
并不是说总是需要这样的东西,但根据我的经验:密码规则可能经常变化。将它们硬烘烤成正则表达式很少是一种持久的方法。