正则表达式密码验证添加下划线像特殊符号

时间:2016-10-14 07:08:55

标签: java regex

密码必须包含: 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

1 个答案:

答案 0 :(得分:2)

无论您是使用正则表达式还是其他方法来验证这些字符串 - 但请:不要将所有内容都压缩成一段代码或正则表达式。

您希望创建易于阅读和维护的代码;和一个包含这么多"编码的正则表达式#34;知识不会有帮助。我不止一次使用像

这样的东西
interface PasswordValidator {
  boolean isValid(String input);
  String getErrorMessage();
}

然后创建实现这种接口的各种类。最后,您只需为每个实现类创建一个对象;你可以将它们放入一些静态列表中。然后验证意味着:只运行该列表中的所有验证器对象。如果失败,您可以直接向用户询问错误消息(这样您就可以准确地告诉他缺少的内容;而不是再次将整个规则集抛给他)。

并不是说总是需要这样的东西,但根据我的经验:密码规则可能经常变化。将它们硬烘烤成正则表达式很少是一种持久的方法。