java - 需要具有动态值的正则表达式

标签 java regex

我需要创建一个正则表达式来匹配下面来自后端的动态值。

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/

相关文章:

java - 任何用于 Java 的字典定义 API?

java - 是否可以使用 API 创建聊天机器人模型,将意图、对话从 Java 传递到 AZURE 机器人服务

c# - 正则表达式先行丢弃匹配项

java - JPA 事务未回滚持久调用。仅在 MySQL 上插入和提交忽略事务规则

java - 将列表转换为 map 的实用程序

java - Apache CSV 解析器 : Issue with ignoring empty lines

java - 如何在 JAVA 中使用正则表达式从字符串中提取特定文本

javascript - 如何获取字符串中美元符号之间的值?

regex - Lighttpd 正则表达式重定向除一个模式之外的所有匹配模式的页面

javascript - 正则表达式仅匹配具有特殊字符的长字符串中的单词