RegEx用于密码验证,仅限特定字符

时间:2016-06-25 13:52:35

标签: javascript regex

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

  1. 最小长度8。
  2. 至少1个大写字母。
  3. 至少1个小写。
  4. 至少1个号码。
  5. 这些字符中有0个或更多!@#$%^& *?_〜() - 允许。
  6. a-z允许。
  7. A-Z允许。
  8. 0-9允许。
  9. 这是我到目前为止的表达方式:

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

    这个表达式主要起作用,除了我需要它只允许子弹5-9。现在它将允许未指定的字符,例如+=

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

2 个答案:

答案 0 :(得分:2)

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

\w

使用先行检查条件2-4。对于实际匹配,我们需要至少8个允许字符的字符。我使用a-zA-Z0-9_整数SELECT t.*, CASE WHEN t.ENDTIME between p.STARTTIME and p.ENDTIME OR p.ENDTIME IS NULL THEN 'TRUE' ELSE 'FALSE' END as Seq FROM @tbl t OUTER APPLY ( SELECT TOP 1 * FROM @tbl WHERE t.STARTTIME < STARTTIME and t.colA = colA and t.colS = colS and t.DATES = DATES ORDER BY STARTTIME ASC) p ORDER BY t.STARTTIME 来缩短时间。

您可以看到它正常工作C# - ThreadPool vs Tasks

网站说明:限制密码中的字符通常被视为一个坏主意。另外here也有关于密码的说法。

答案 1 :(得分:1)

您可以将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);