AngularJS 四分之三的验证

AngularJS three out of four validations

我正在尝试验证密码,但遇到了问题。现在,我有下一个验证器的输入:

<form name="RegisterForm">
    <input type="password" name="password"
                           ng-minlength="8"
                           ng-maxlength="20"
                           space-restricted
                           numbers-required
                           lowercase-required
                           uppercase-required
                           special-characters-required
                           password-validator
                           required>
</form>

这是小写验证器的示例:

function lowercaseRequired() {
    return {
        require: 'ngModel',
        restrict: 'A',
        link: link
    };
}

function link(scope, element, attrs, ngModel) {
    ngModel.$parsers.unshift(function(value) {
        var validationPattern = /(?=.*[a-z])|^$/,
            isValid = validationPattern.test(value);

        ngModel.$setValidity('lowercaseRequired', isValid);
        return isValid ? value : undefined;

}

How i can handle minimum three out of four validations?

我考虑过大正则表达式,但我认为这是个坏主意。因此,我需要获得一个包含以下内容的密码:最少 8 个字符,最多 20 个字符,不包含空格,并且至少包含四次验证中的三次。

答案如下: ^((?=.*[\d])(?=.*[a-z])(?=.*[A-Z])|(?=.*[a-z])(?=.*[A-Z])(?=.*[^\w\d\s])|(?=.*[\d])(?=.*[A-Z])(?=.*[^\w\d\s])|(?=.*[\d])(?=.*[a-z])(?=.*[^\w\d\s])).{8,20}$

REGEXR

其中:

  • ^ - 行首锚点
  • ((?=.*[\d]) - 检查数字
  • (?=.*[a-z]) - 检查小写
  • (?=.*[A-Z]) - 检查大写
  • |(?=.*[a-z]) (?=.*[A-Z]) (?=.*[^\w\d\s]) - 检查特殊字符
  • |(?=.*[\d]) (?=.*[A-Z]) (?=.*[^\w\d\s])|(?=.*[\d]) (?=.*[a-z]) (?=.*[^\w\d\s]))\S{8,20} - 匹配来自 8 的任何字符('\S' 期望空格)在行 anchor
  • 的末尾 20 开始字符