0

我建立了一个正则表达式模式来检查密码的强度:

(?=^.{8,15}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*

它强制用户使用来自以下 4 个类别中的至少 3 个字符的密码:

  1. 至少 1 个大写字符
  2. 至少 1 个小写字符
  3. 至少 1 个数字字符
  4. 至少 1 个特殊字符/符号

注意:它还强制执行最小和最大长度 {8,15}

该模式在服务器端 PHP 脚本上运行良好,我还使用多个 javascript Regex-tester-tools(例如http://www.regular-expressions.info/javascriptexample.html)对其进行了测试。到目前为止一切看起来都很完美......

但是,如果我在一个简单的Extjs 文本字段验证器中使用它,如果我使用所有 4 个类别,验证器只会返回 TRUE。

validator: function (value) {

        var pattern = 
            '(?=^.{8,15}$)'+
            '((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|' + 
            '(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|' +
            '(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|' +
            '(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*';
        if (value.match(pattern)) {
            return true;
        } else {
            return this.i18n.invalidPassword;
        }
    }

而现在,我的想法已经不多了......

4

1 回答 1

3

您设置的模式不正确:

    var pattern = new RegExp(
        '(?=^.{8,15}$)'+
        '((?=.*\\d)(?=.*[A-Z])(?=.*[a-z])|' + 
        '(?=.*\\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|' +
        '(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|' +
        '(?=.*\\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*'
    );

请注意,\\而不是\. 如果你不这样做,那么\当正则表达式代码到达它时,它就会消失。您也可以使用本机正则表达式语法,但无法将其拆分为多行。

编辑——特别是在你的正则表达式\\中出现之前\d。如果你不加倍反斜杠,那么正则表达式只会看到一个小写的“d”。

于 2013-07-30T14:15:12.840 回答