【问题标题】:Correct joining of this regex for password confirmation正确加入此正则表达式以确认密码
【发布时间】:2019-08-16 16:28:59
【问题描述】:

尝试创建一个 jquery 函数来检查密码是否满足某些要求,密码必须包含至少 3 个字符,即大写、数字或特殊字符。这可以是 3 个的混合,所以可以是 2 个大写和 1 个特殊等......

我创建了一个使用正则表达式检查的函数,但它很长,我知道它可以连接在一起,但我似乎无法弄清楚如何。

$('#Password').blur(function () {
        var pswd = $(this).val();
        if (pswd.length > 7) {
            if (pswd.match(/(?=(.*[A-Z].*){3,}).{7,}/) // 3 caps
                ||
                pswd.match(/(?=(.*\W.*){3,}).{7,}/) // 3 special chars
                ||
                pswd.match(/(?=(.*\d.*){3,}).{7,}/) // 3 digits
                ||
                (pswd.match(/(?=(.*[A-Z].*){2,})/ && pswd.match(/(?=(.*\W.*){1,})/))) // 2 caps 1 special
                ||
                (pswd.match(/(?=(.*[A-Z].*){1,})/ && pswd.match(/(?=(.*\W.*){2,})/))) // 1 cap 2 special
                ||
                (pswd.match(/(?=(.*[A-Z].*){2,})/ && pswd.match(/(?=(.*\d.*){1,})/))) // 2 cap 1 digit
                ||
                (pswd.match(/(?=(.*[A-Z].*){1,})/ && pswd.match(/(?=(.*\d.*){2,})/))) // 1 cap 2 digit
                ||
                (pswd.match(/(?=(.*\W.*){2,})/ && pswd.match(/(?=(.*\d.*){1,})/))) // 2 special 1 digit
                ||
                (pswd.match(/(?=(.*\W.*){1,})/ && pswd.match(/(?=(.*\d.*){2,})/))) // 1 special 2 digit
                ||
                (pswd.match(/(?=(.*\W.*){1,})/ && pswd.match(/(?=(.*\d.*){1,})/) && pswd.match(/(?=(.*[A-Z].*){1,})/)))
            ) // 1 of each /
            {
                $('#Message').hide();
            }
        } else {
            $('#Message').show();
        }
    });

该功能工作正常,但我想改进正则表达式,是否可以在更好的时间内进行相同的密码检查或减少代码。

【问题讨论】:

  • 我知道我可以用 .但是有没有更好更有效的方法。
  • "但它很长,我知道它可以连接在一起" 你想制作一个单一的正则表达式,还是想让你的函数更具可读性?
  • 我正在寻找单个正则表达式,我不确定它是否可以实现。

标签: javascript jquery regex passwords


【解决方案1】:

如果你统计字符串中出现的特殊字符,比如:

pswd.match(/(?=[A-Z])|(?=[0-9])|(?=[#$^+=!*()@%&])/g).length

...并在您的情况下与“3”进行比较。

@PJProudhon - 感谢您的建议:

pswd.match(/[A-Z]|[0-9]|[#$^+=!*()@%&]/g).length

【讨论】:

  • 我喜欢这个,这是一个很好的解决方案。谢谢。
  • 对于这种匹配,前瞻不是必需的。
【解决方案2】:

关注“必须包含至少 3 个字符,大写、数字或特殊字符”。

您可以表示为:包含至少 3 个非小写字符。这样这里甚至不需要加入。

我试试^(?=(?:[a-z]*[^a-z]){3}).{7,}$

【讨论】:

  • 好吧,你赢了,我的错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 2021-08-05
相关资源
最近更新 更多