java - 正则表达式密码验证添加下划线,如特殊符号

标签 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();

    }

}

我只是尝试在验证函数中使用相同的文本设置新字符串:Test_1523 并返回 true,但是当我通过休息服务发布此字符串并将其传递给函数时,返回 false

最佳答案

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

您想要创建易于阅读和维护的代码;包含如此多“编码”知识的单个正则表达式对此无济于事。我不止一次使用过类似的东西

interface PasswordValidator {
  boolean isValid(String input);
  String getErrorMessage();
}

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

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

关于java - 正则表达式密码验证添加下划线,如特殊符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40037030/

相关文章:

java - 我可以将哪个免费版本的 Java 用于生产环境和/或商业用途?

java - 使用Xero的Java SDK支持多个私有(private)应用程序的身份验证?

javascript - 判断一个字符串是否为 "empty"

javascript - 仅替换出现在第一个元素中

javascript - 用于计算特定事件的正则表达式模式

java - 如何获取 Eclipse 中方法抛出的具体异常列表

Java - 突破物理学?

java - 将 tomcat 作为服务启动时出现无效的变音字符

.net - 替换整行会产生重复出现的替换文本

javascript - 为什么我的正则表达式仅在某些浏览器中有效?