【问题标题】:Regex to validate a password [duplicate]正则表达式验证密码[重复]
【发布时间】:2013-01-19 20:38:46
【问题描述】:

可能重复:
Password validation regex

8 到 16 个字符,3 个字符类别中的每个类别至少有 1 个字符 - 大小写字母、数字、符号。

我有这段代码,但它不起作用,当我写超过 16 个字符时,它被认为是有效的,但它不应该;它应该适用于 3 个字符类,但它适用于 4 个字符类,我的错误在哪里??

http://jsbin.com/ugesow/1/edit

<label for="pass">Enter Pass: </label>
<input type="text" id="pass" onkeyup="validate()">

脚本

function validate() {
    valor = document.getElementById('pass').value;
    if (!(/(?=.{8,16})(?=.*?[^\w\s])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*/.test(valor))) {

        document.getElementById('pass').style.backgroundColor = "red";
    } else {
        document.getElementById('pass').style.backgroundColor = "#adff2f";
    }
}

【问题讨论】:

  • 您有兴趣让这个特定的正则表达式工作吗?在其他地方你可以把你的问题分成更小的部分,比如检查长度等。
  • 如果您提供一个示例列表,说明哪些是有效的,哪些不是。
  • @vault 不一样
  • @Kakitori:非常相似。

标签: javascript html regex


【解决方案1】:

为什么不直接用正则表达式测试这三个字符集:

[A-Za-z0-9]+

然后统计字符串的长度来验证长度。

【讨论】:

  • 你的正则表达式接受几乎所有非符号字符,这不是他要求的
  • 我使用了“龙书”中的符号,因为我认为这是标准。我认为将其转换为 JavaScript 语法会很容易。 :\
  • 我还没有读过它,但我希望有一本关于编译器的书谈论纯理论的正则表达式,而不是我们用于字符串操作的正则表达式。很大,很大的区别。
【解决方案2】:

这个范围怎么样:

/[A-Za-z0-9$-/:-?{-~!"^_`\[\]]/

所以你可以先检查

/[A-Za-z]+/ 

然后

/\d+/ 

最后

/[$-/:-?{-~!"^_`\[\]]+/  

如果通过了,你可以检查长度。

您可以查看link 了解这些符号为何起作用。

【讨论】:

  • 他可以用这些来检查他需要的东西,这不是真正的正则表达式。
  • 你似乎是唯一一个这么认为的人
  • 真的吗?他可以检查符号、字母和数字。因此,如果他执行以下操作: /[A-Za-z]+/ 然后 /\d+/ 最后 /[$-/:-?{-~!"^_`[]+] 他可以做他想做的事...有更好的方法,但有效。
  • not 做 OP 所要求的。单字符密码将通过,根据要求不正确
【解决方案3】:

您需要将匹配锚定到字符串的开头,并将第一个lookahead锚定到末尾:

^(?=.{8,16}$)

另外,最后的前瞻需要一分为二:

(?=.*?[A-Z])(?=.*?[a-z])

【讨论】:

【解决方案4】:

正则表达式不是灵丹妙药。做起来并不难,与常规代码混合:

function validatePassword(password) {
    // First, check the length.
    // Please see my comment on the question about maximum password lengths.
    if(password.length < 8 || password.length > 16) return false;
    // Next, check for alphabetic characters.
    if(!/[A-Z]/i.match(password)) return false;
    // Next, check for numbers.
    if(!/\d/.match(password)) return false;
    // Next, check for anything besides those.
    if(!/[^A-Z\d]/i.match(password)) return false;
    // If we're here, it's valid.
    return true;
}

但是,我会研究类似zxcvbn 之类的密码检查器,我认为它是一个更好的密码质量检查器,检查诸如 un-13375p3/-\kification 和 dealing with entropy decently 之后的常用字典单词之类的内容。它被 Dropbox 等使用。 Try it here.

【讨论】:

  • 我就是这样解决这个问题的:D
猜你喜欢
  • 1970-01-01
  • 2015-06-10
  • 2016-06-03
  • 2016-10-30
  • 2016-04-15
  • 2014-12-12
  • 2016-10-09
  • 2016-04-12
  • 2014-12-16
相关资源
最近更新 更多