正确加入此正则表达式以确认密码

Correct joining of this regex for password confirmation

尝试创建一个 jquery 函数来检查密码是否满足特定要求,密码必须包含至少 3 个字符,即大写字母、数字或特殊字符。这可以是 3 个的混合,因此可以是 2 个大写字母和 1 个特殊字母等等....

我创建了一个使用正则表达式进行检查的函数,但它很长,我知道它可以连接在一起,但我似乎无法弄清楚如何。

$('#Password').blur(function () {
        var pswd = $(this).val();
        if (pswd.length > 7) {
            if (pswd.match(/(?=(.*[A-Z].*){3,}).{7,}/) // 3 caps
                ||
                pswd.match(/(?=(.*\W.*){3,}).{7,}/) // 3 special chars
                ||
                pswd.match(/(?=(.*\d.*){3,}).{7,}/) // 3 digits
                ||
                (pswd.match(/(?=(.*[A-Z].*){2,})/ && pswd.match(/(?=(.*\W.*){1,})/))) // 2 caps 1 special
                ||
                (pswd.match(/(?=(.*[A-Z].*){1,})/ && pswd.match(/(?=(.*\W.*){2,})/))) // 1 cap 2 special
                ||
                (pswd.match(/(?=(.*[A-Z].*){2,})/ && pswd.match(/(?=(.*\d.*){1,})/))) // 2 cap 1 digit
                ||
                (pswd.match(/(?=(.*[A-Z].*){1,})/ && pswd.match(/(?=(.*\d.*){2,})/))) // 1 cap 2 digit
                ||
                (pswd.match(/(?=(.*\W.*){2,})/ && pswd.match(/(?=(.*\d.*){1,})/))) // 2 special 1 digit
                ||
                (pswd.match(/(?=(.*\W.*){1,})/ && pswd.match(/(?=(.*\d.*){2,})/))) // 1 special 2 digit
                ||
                (pswd.match(/(?=(.*\W.*){1,})/ && pswd.match(/(?=(.*\d.*){1,})/) && pswd.match(/(?=(.*[A-Z].*){1,})/)))
            ) // 1 of each /
            {
                $('#Message').hide();
            }
        } else {
            $('#Message').show();
        }
    });

该功能运行良好,但我想改进正则表达式,是否可以在更短的时间内或减少代码来执行相同的密码检查。

关注"must contain at least 3 characters being uppercase, numbers or special characters"。

可以表示为:至少包含3个非小写字符。这样这里甚至不需要连接。

我会尝试^(?=(?:[a-z]*[^a-z]){3}).{7,}$

如果计算字符串中特殊字符的出现次数,如:

pswd.match(/(?=[A-Z])|(?=[0-9])|(?=[#$^+=!*()@%&])/g).length

...并与您的情况下的“3”进行比较。

@PJProudhon - 感谢您的建议:

pswd.match(/[A-Z]|[0-9]|[#$^+=!*()@%&]/g).length