我需要创建一个正则表达式来匹配下面来自后端的动态值。
int passwordMaxLength = 10;
int passwordMinAlpha = 1;
int passwordMinCharType = 1;
int passwordMinLength = 5;
int passwordMinLower = 1;
int passwordMinNumeric = 1;
int passwordMinSpecial = 1;
int passwordMinUpper = 1;
String passwordNumberCharacters = "123";
String passwordSpecialCharacters = "@";
String passwordUpperCharacters = "ABC";
提前致谢!
这是我到目前为止所拥有的:
String pattern1 = "^(?=(.*["+passwordUpperCharacters+"]){"+passwordMinUpper+",})(?=(.*[a-z]){"+passwordMinLower+",})(?=(.*["+passwordSpecialCharacters+"]){"+passwordMinSpecial+",})(?=(.*["+passwordNumberCharacters+"]){"+passwordMinNumeric+",})(*["+passwordUpperCharacters+""+passwordNumberCharacters+"]*[@]){"+passwordMinLength+","+passwordMaxLength+"}$";
最佳答案
正如所建议的,单个正则表达式首先难以制作,其次难以维护。 想象一下,作为一个项目的新手,必须修改您提供的正则表达式......老实说,这将是一场噩梦!
做到这一点的一个好方法是拥有一个类来独立地检查所有这些约束。 您可以为每个约束想象一个方法。这样在阅读时就会很容易理解,并且在任何约束条件发生变化的情况下你都可以轻松做到这一点!
这是一个可以做到这一点的类的示例(目前仅检查大小和位数,但很容易添加验证)
public class PasswordChecker {
private int passwordMaxLength = 10;
private int passwordMinAlpha = 1;
private int passwordMinCharType = 1;
private int passwordMinLength = 5;
private int passwordMinLower = 1;
private int passwordMinNumeric = 1;
private int passwordMinSpecial = 1;
private int passwordMinUpper = 1;
private String passwordNumberCharacters = "123";
private String passwordSpecialCharacters = "@";
private String passwordUpperCharacters = "ABC";
public PasswordChecker() {
}
public boolean isValid(String password){
// here you can add many more functions !
return hasValidLength(password) && hasValidNumberOfDigits(password);
}
private boolean hasValidLength(String password) {
return password.length() <= passwordMaxLength;
}
private boolean hasValidNumberOfDigits(String password) {
int count = 0;
for (int i = 0, len = password.length(); i < len; i++) {
if (Character.isDigit(password.charAt(i))) {
count++;
}
}
return count >= passwordMinNumeric;
}
}
然后你可以使用passwordChecker.isValid(password)
来调用它
然后,如果您想验证每个语句并返回密码中无效内容的完整解释,我建议您为每个想要的验证返回一个具有 boolean 属性的对象,然后返回该对象,并且它将为每个验证是否可以或 KO 类似:
class PasswordValidation {
private String password;
private boolean hasMaximumLength;
private boolean hasMinimumNumberOfDigits;
// here add all of your validations ...
// also constructor and getters + setters
}
在 PasswordChecker
类中,您可以在方法中添加类似这样的内容(最大长度示例)
private PasswordValidator hasValidLength(String password, PasswordValidator validator) {
validator.setHasMaximumLength(password.length() <= passwordMaxLength);
return validator
}
并返回此 validator
:
public boolean isValid(String password){
PasswordValidator validator = new PasswordValidator(password);
validator = hasValidLength(password, validator);
validator = hasValidNumberOfDigits(password, validator);
// here keep validating
return validator;
}
关于java - 需要具有动态值的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57007323/