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