【问题标题】:password validation using javascript使用javascript验证密码
【发布时间】:2013-04-02 09:34:08
【问题描述】:

我需要使用符合以下要求的 javascript 匹配密码字段:

  1. 应该是包含至少一个特殊字符的字母数字。
  2. 不允许有空格
  3. 应最少 10 个字符,最多 20 个字符。
  4. char 的重复次数不得超过 2 次。
  5. ~,'.:;^|不允许

我有一个正则表达式
var 密码 = /^(?=.[0-9])(?=.[!@#$%^&])[a-zA-Z0-9!@# $%^&]{10,20}$/; 我该如何解决这个问题?

【问题讨论】:

  • var 密码 = /^(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@ #$%^&*]{10,20}$/;
  • 我不会对用户强加这样的密码限制。以下是对密码强度的相当彻底的分析:tech.dropbox.com/2012/04/…
  • @SachinMalmanchi 请检查我的正则表达式是否适合你

标签: javascript regex passwords


【解决方案1】:

这可能是必需的正则表达式

^(?=.*[!@#$%^&])(?!.*(.).*\1.*\1)[A-Za-z\d!@#$%^&|]{10,20}$

(?=.*[!@#$%^&]) 确保列出的字符至少出现一次。

(?!.*(.).*\1.*\1) 确保没有字符重复超过两次。

[A-Za-z\d!@#$%^&|]{10,20} 匹配字符类中出现 10-20 次的字符。

【讨论】:

  • @Loamhoof 它会在哪里失败?请举个例子
  • 我在发布后立即删除了我的评论,因为它是错误的,对不起。
  • 尽管您仍然应该更改(?=.*[!@#$%^&].*),因为它在性能方面非常糟糕,最后一个 .* 是不必要的。尽管如此,我猜这么小的字符串并不重要。
  • @Loamhoof 如果性能是一个问题,应该完全避免使用正则表达式。
【解决方案2】:

我会编写单独的规则(可能对所有规则都使用正则表达式 - 为了一致性 - 除非性能是一个很大的问题),每个规则都与您列表中的规则直接相关。

代码

var pw = "asddfak@kjg";

/* Should be alpha numaric with at least one special character. */
console.log(null !== pw.match(/[@+#$]/));

/* no spaces to be allowed */
console.log(null !== pw.match(/^\S+$/));

/* should be minimum 10 char and max 20 chars. */
console.log(null !== pw.match(/^.{10,20}$/));

/* No repeate of char more than 2 times. */
console.log(null === pw.match(/(.)(.*\1){2}/));

/* ~,'.:;^| are not allowed */
console.log(null !== pw.match(/^[^~,'.:;^|]+$/));

虽然可以使正则表达式更简洁,但我认为使规则更符合您的意图更易于维护。如果性能是一个重要问题(通常不是这种事情),那么我会避免使用正则表达式,并使用字符串方法来实现规则。

正则表达式解释

/           // start regex pattern
[           // open character class
@+#$        // match one of these `special` characters
]           // close character class
/           // end regex pattern 

/           // start regex pattern
^           // start matched string
\S+         // one or more (`+`) not spaces (`\S`)
$           // end matched string
/           // end regex pattern 

/           // start regex pattern
^           // start matched string
.{10,20}    // between 10 and 20 of any character (`.`)
$           // end matched string
/           // end regex pattern 

/           // start regex pattern
(.)         // any character captured as group 1
(.*\1){2}   // followed by zero or more of anything (`\.*`) and then the captured group 1 (`\1`) two times (`{2}`)
/           // end regex pattern 

/           // start regex pattern
^           // start matched string
[           // open character class
^~,'.:;^|   // not (`^`) one of these characters
]+          // close character class
$           // end matched string
/           // end regex pattern 

附言。您应该保留很多带有正则表达式的 cmets,因为与书籍不同,它们写起来比读起来容易得多

【讨论】:

  • [^\s] 可以替换为\S
  • @NaveedS 已更新 - 谢谢。还有什么改进吗?我确实喜欢一个好的正则表达式!
  • @Billy Moon:我们如何用正则表达式来写这个?请回复我
  • @SachinMalmanchi 我的解决方案对您定义的每个规则都使用正则表达式。然后,您需要根据每条规则检查您的密码。我的演示代码向您显示了 javascript 控制台中有效密码的输出。如果您将输入更改为无效密码,则一个或多个规则将失败,在我的演示代码中显示false。您应该编写一个包装函数,包括我的演示代码,它接受密码,并为有效密码返回 true,如果密码无效则处理错误。如果密码无效,您应该通知用户违反了哪条规则。
【解决方案3】:

这应该可行:

/^(?=.*?[!@#$%^&])(?:([a-zA-Z0-9!@#$%^&])(?!.*?\1.*?\1)){10,20}$/

(如果重复超过 2 次,则表示同一个字符不能出现三次)

解释:
第一个条件:一开始,我们将第一次遍历整个字符串,直到找到一个特殊字符,尽快既然我们有它,我们就会停止,如果我们不这样做,它就会失败 (Source):(?=.*?[!@#$%^&])
第二个条件:无事可做,[a-zA-Z0-9!@#$%^&] 不允许空格无论如何
第三个​​条件:量词:{10,20}
第四个条件:微妙的一个:当我们通过字符串时,对于捕获的每个字符,我们检查它不再重复两次(同一来源):(?!.*?\1.*?\1)
第 5 个条件:与空格相同

【讨论】:

  • 你能解释一下吗?
  • @Loamhoof 我的正则表达式会在哪里失败?请举个例子
  • @SachinMalmanchi 当然不是因为 * 不在您“给予”的特殊字符列表中。
【解决方案4】:

根据您要求中的 5 件事,这正是您需要的模式

^(?=.*[!@#$%^&])(?!.*(.).*\1.*\1)[^\s~,'.:;^|]{10,20}$

【讨论】:

  • 你能举出满足你的条件并且在这种模式下失败的例子
  • 用我的正则表达式在这个网站上测试它与 sachin*10&M regexpal.com
猜你喜欢
  • 1970-01-01
  • 2011-08-14
  • 2013-12-09
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
相关资源
最近更新 更多