匹配至少一个字母,一个数字和一个非alphanum

时间:2013-03-13 16:50:07

标签: javascript regex

我一直在尝试制作密码验证器。它只允许密码至少包含一个字母,至少一个数字和至少一个非字母数字字符。

我的下面有效:

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)”。有谁知道如何将它组合成一个正则表达式?

3 个答案:

答案 0 :(得分: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位数(?=.*\d)。它可以先于某事与否。
接下来是字母字符和非字母字符。使用\w(“单词”字符是任何字母或数字)重复数字是错误的(仅对数字和特殊字符进行测试)。
\是字符串中的特殊含义,因此测试错误。

希望有所帮助

答案 1 :(得分: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;
}

答案 2 :(得分: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;
}