当前位置: 首页 > 知识库问答 >
问题:

Regex至少验证两个字符类(字母、数字、特殊字符)

庞修贤
2023-03-14
((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[\\d]))|((?=.*[A-Z])(?=.*[\\d]))|((?=.*[!#+,.\\=:=@-])(?=.*[\\d]))|((?=.*[!#+,.\\=:=@-])(?=.*[a-z]))|((?=.*[!#+,.\\=:=@-])(?=.*[A-Z]))
wel123 - valid
123@@! - valid
@@@aaa - valid
!!!BDC - valid
ABC123 - valid
rrirrra - invalid
1234567 - invalid
ABCFESS - invalid
@@@!!!! - invalid

共有1个答案

孔华池
2023-03-14

您的regex中唯一缺少的是添加开始^$结束锚点,并正确地对整个regex进行分组。我还从您的regex中删除了不必要的分组,您可以使用此regex,

^(?:(?=.*[a-z])(?=.*[A-Z])|(?=.*[a-z])(?=.*[\d])|(?=.*[A-Z])(?=.*[\d])|(?=.*[!#+,.\\=:=@-])(?=.*[\d])|(?=.*[!#+,.\\=:=@-])(?=.*[a-z])|(?=.*[!#+,.\\=:=@-])(?=.*[A-Z])).+$

Regex演示

尽管这种方法很有效,但我还是建议您编写一段代码来实现这一点,因为这个regex对一般人来说可能是不可维护的。

public static void main(String[] args) {
    int minRequiredMatch = 2;
    List<String> list = Arrays.asList("wel123","123@@!","@@@aaa","!!!BDC","ABC123","rrirrra","1234567","ABCFESS","@@@!!!!");

    list.forEach(x -> {
        System.out.println(x + " - " + (validateTwoCharSets(x, minRequiredMatch)?"Valid":"Invalid"));
    });
}

public static boolean validateTwoCharSets(String str, int minRequiredMatch) {
    List<Pattern> patList = new ArrayList<>();
    patList.add(Pattern.compile("[a-z]"));
    patList.add(Pattern.compile("[A-Z]"));
    patList.add(Pattern.compile("[0-9]"));
    patList.add(Pattern.compile("[!#+,-./:=@]"));

    return validateTwoCharSets(patList, str, minRequiredMatch);
}

public static boolean validateTwoCharSets(List<Pattern> patList, String str, int minRequiredMatch) {
    if (minRequiredMatch <0 || minRequiredMatch > patList.size()) {
        throw new RuntimeException("minRequiredMatch must be a positive number and not more than pattern list size.");
    }
    int matchCount = 0;

    for (Pattern p : patList) {
        Matcher m = p.matcher(str);
        if (m.find()) {
            matchCount++;
        }
        if (matchCount >= minRequiredMatch) {
            return true;
        }
    }

    return false;
}
wel123 - Valid
123@@! - Valid
@@@aaa - Valid
!!!BDC - Valid
ABC123 - Valid
rrirrra - Invalid
1234567 - Invalid
ABCFESS - Invalid
@@@!!!! - Invalid
 类似资料:
  • 朋友们,可以在一个正则表达式中验证特殊字符的最小值、大写字母的最小值和数字的最小值吗? 字符串示例: 我想要的是: 我想要一个正则表达式来验证至少2个特殊字符、2个数字和2个大写字母

  • 我需要一个正则表达式,它应该至少有一个数字字符,允许大小写字母,也允许特殊字符 但它对最大字符10无效。

  • 我试图验证一个字符串,它应该只包含字母、数字和特殊字符。为此,我尝试使用正则表达式。 在使用上述代码时,字符串是有效的。但我的要求是出示这个无效。ie每当出现字母、数字或特殊字符以外的字符时,字符串的计算结果应为无效。如何使用regex实现这一点?

  • 我需要密码字段的正则表达式。 要求是: > 密码长度必须为8到20个字符 必须包含至少一个字母和一个数字以及来自

  • 我需要一个正则表达式来检查: 密码至少包含八个字符,其中至少包含一个数字,并且包含大小写字母和特殊字符,例如、、。 它不能是您的旧密码,也不能包含您的用户名、或 这里是我的验证表达式,它针对八个字符,包括一个大写字母,一个小写字母,和一个数字或特殊字符。 密码必须是八个字符,包括一个大写字母,一个特殊字符和字母数字字符,我怎么写呢?

  • 我想使用正则表达式来验证名称。名称必须包含名、中间名、姓氏(不一定全部)。但我还想设置一个条件,即名称必须至少包含四个字符。我在这里找到了用于验证全名的正则表达式Java regex to validate full name…,并在这里找到用于检查字符串中是否至少有三个字符(字母)的正则表达式regex,以检查是否至少有3个字符。但我不确定如何将这两者结合起来以获得期望的结果。请帮助我实现所需的