-1

我一直在尝试制作密码验证器。它只允许使用至少一个字母、至少一个数字和至少一个非字母数字字符的密码。

我有以下工作:

function passwordValidate(password, password_c, msg)
{
    if (notEmpty(password, "Enter a password"))
    {
        if (password.value === password_c.value)
        {
            if(/\W/.test(password.value))
            {
                if (/\d/.test(password.value) && /[a-zA-Z]/.test(password.value))
                {
                    return true;
                } else {
                    alert(msg);
                }
            } else {
                alert("Must have a special character in your password");
            }
        } else {
            alert("Passwords don't match");
        }
    }
    return false;
}

我最初有“ password.value.match("\W|_")”,这导致了问题,因此将其更改为“ /\W/.test(password.value)”。有谁知道我如何将它组合成一个正则表达式?

4

3 回答 3

1

你可以使用断言。
断言子模式以常规方式匹配,只是它不会导致当前匹配位置发生变化。

尝试:

var rgx=/(?=.*\d)(?=.*[a-zA-Z])(?=.*[^0-9a-zA-Z])/

//my test
var theTest=['azert7ui@i4','uiou5','4761238|z','jhkj','8989go','457@457'];
for (i=0;i<theTest.length;i++) alert(theTest[i]+' '+rgx.test(theTest[i]));

所以最初我们测试 1 digit ( ?=.*\d) 。它可以以某事开头,也可以不以某事开头。
接下来是字母字符和非字母字符。使用\w重复数字错误的(“单词”字符是任何字母或数字)是错误的(仅使用数字和特殊字符测试为真)。
\是字符串中的特殊含义,因此测试是错误的。

希望有帮助

于 2013-03-13T16:55:10.723 回答
1

此外,不要让这些嵌套的if语句阶梯式出现,而是尽早突破。它更清洁:

function passwordValidate(password, password_c, msg) {
    if (!notEmpty(password, "Enter a password")) {
        return false;
    }

    if (password.value !== password_c.value) {
        alert("Passwords don't match");
        return false;
    }

    if(!/(?=.*\d)(?=.*[a-zA-Z])(?=.*[^\da-zA-Z])/.test(password.value)) {
        alert("Must have a special character in your password");
        return false;
    }

    alert(msg);
    return true;
}
于 2013-03-13T16:58:48.110 回答
0

// 做单独的测试可能更容易-

function testPassword(pw){
    pw= pw.replace(/\s+/, ''); //remove spaces
    var msg= [' non-alphanumerical', ' alphabetical', ' digit'],
    rx= [/\W/,/[a-zA-Z]/,/\d/];
    for(var i= 0;i<3;i++){
        if(!rx[i].test(pw)) throw Error('At least one'+
        msg[i]+' character is required');
    }
    return pw;
}
于 2013-03-13T17:32:59.040 回答