【问题标题】:RegEx for password validation, only specific characters [duplicate]用于密码验证的正则表达式,仅特定字符 [重复]
【发布时间】:2016-10-28 00:12:58
【问题描述】:

我正在尝试为密码验证创建正则表达式。以下是要求。

  1. 最小长度 8.
  2. 至少 1 个大写字母。
  3. 至少 1 个小写字母。
  4. 至少 1 个数字。
  5. 0 个或多个这些字符 !@#$%^&*?_~()- 允许。
  6. 允许 a-z。
  7. 允许 A-Z。
  8. 允许 0-9。

这是我目前的表达方式:

^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*?_~()-]*).*$

这个表达式最有效,除了我需要它只允许项目符号 5-9。现在它将允许未指定的字符,例如+=

如何修改此表达式以仅允许项目符号 5-9 而不允许其他字符?

【问题讨论】:

  • 为什么要限制密码中的字符?更重要的是,为什么其他字符会成为您的密码存储问题?
  • 为什么不对这些使用单独的检查?
  • 不确定您所说的 “允许 5-9 并且没有其他字符”是什么意思
  • @PeeHaa 后端已经这样设计了。
  • @melpomene 在正则表达式方面我是个菜鸟。我愿意接受任何建议。

标签: javascript regex


【解决方案1】:

你不需要对第一个和第五个到第八个条件进行前瞻检查 - 你可以在最后一场比赛中检查这一切,比如

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\w!@#$%^&*?~()-]{8,}$

使用前瞻检查条件 2-4。对于实际匹配,我们需要您允许的字符中的至少 8 个字符。我使用\w 而不是a-zA-Z0-9_ 来缩短时间。

你可以看到它在工作here

站点注释:限制密码中的字符通常被视为一个坏主意。 xkcd 对密码也有话要说。

【讨论】:

    【解决方案2】:

    您可以将RegExp 拆分为离散部分,添加或删除所需部分,使用Array.prototype.every(),在函数中包含&& !/[+=]/.test(str),以及输入字符串的.length 属性

    var matches = [/[A-Z]/, /[a-z]/, /\d/, /[!@#$%^&*?_~()-]/];
    var str = "Ab0!#?~_";
    var pw = matches.every(function(re) {
      return re.test(str) && !/[+=]/.test(str)
    }) && str.length === 8;
    console.log(pw);

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 2016-10-09
      • 1970-01-01
      • 2015-01-05
      • 2013-01-19
      • 1970-01-01
      • 2016-06-03
      • 2015-06-10
      相关资源
      最近更新 更多