如果满足一定数量的条件,则使用Regex进行测试

时间:2014-11-18 22:53:41

标签: javascript regex

我需要弄清楚密码是否符合多个条件,但不是全部。

必须包括3个4个条件

a) A-Z
b) a-z
c) 0-9
d) !*?$%&

如果密码有一个大写字母,一个较低的字母和一个numnber,或者代替一个特殊的字符,那么它是正确的......

如果不写几个OR条件(a + b + c或a + b + d或a + c + d或b + c + d),这是否可行?

3 个答案:

答案 0 :(得分:2)

这个网站也可能会给出一些答案: http://www.zorched.net/2009/05/08/password-strength-validation-with-regular-expressions/

旁注:使用符号,小写,大写,数字确实会增加熵,但长度更重要。 CorrectHorseBatteryStaple(http://xkcd.com/936/)的例子让我大开眼界。

答案 1 :(得分:1)

我避免使用单个正则表达式的问题,只需将简单的正则表达式组合到一个数组中,使用Array.prototype.filter()对表达式数组测试输入的密码即可创建新的来自那些匹配的数组,其中单个正则表达式测试为true(使用RegExp.prototype.test()):

function validateConditions (string, n) {
    // individual tests:
    var capital = /[A-Z]/, // any letter, from the characters A-Z (inclusive)
        lower = /[a-z]/, // any letter, from the characters a-z (inclusive)
        numeric = /\d/, // any number character
        special = /[!*?$%&]/, // any of these special characters

    // an array of those simple tests:
        tests = [capital, lower, numeric, special],
    // filtering the array of tests (to create a new array 'success'):
        success = tests.filter(function (validate) {
            // if the string tests true (RegExp.test returns a Boolean value):
            if (validate.test(string)) {
                // we return true (though any value would be fine, since
                // we're only checking the length of the 'success' array):
                return true;
            }
        });

    // making sure that the 'success' array has a length equal to, or greater
    // than the required number ('n') of matches:
    return success.length >= n;
}

// adding an event-listener to the 'test' element, which runs on 'keyup':
document.getElementById('test').addEventListener('keyup', function (e) {
    // logging the returned Boolean of validateConditions():
    console.log(validateConditions(e.target.value, 3));
});

JS Fiddle demo

参考文献:

答案 2 :(得分:0)

使用正则表达式lookaheads查看是否可以将正则表达式的野兽混在一起。我检查了谷歌"正则表达式密码复杂性"并且发现了类似的问题,所以我从那里开始。