【问题标题】:Regex pattern does not work properly.. but only in Extjs / Javascript正则表达式模式无法正常工作.. 但仅限于 Extjs / Javascript
【发布时间】:2013-07-30 14:09:47
【问题描述】:

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

(?=^.{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。 p>

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;
        }
    }

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

【问题讨论】:

  • 评论:像这样的密码验证器对于使用安全随机密码生成器的人来说是一场真正的噩梦。另外,为什么最大长度这么低?无论如何,密码肯定是以散列方式存储的;如果它们更长,会有什么不同?

标签: javascript regex extjs extjs3


【解决方案1】:

您设置的模式不正确:

    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]))^.*'
    );

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

edit — 具体来说,在您的正则表达式中出现 \d 之前的 \\。如果你不加双反斜杠,那么正则表达式只会看到一个小写的“d”。

【讨论】:

  • 不,您不需要使用 RegExp... 顺便说一句,它不会改变任何东西。但感谢您的回复
  • @derphil well something 必须将字符串解析为正则表达式,关键是如果您不将反斜杠字符加倍,它将不起作用。
  • @Pointy 你忘记删除分号了。
  • @Pointy:谢谢! \\ 是完美的提示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2016-05-09
  • 1970-01-01
相关资源
最近更新 更多