用于密码验证的正则表达式,仅特定字符 [重复]

Posted

技术标签:

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

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

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

这是我目前的表达方式:

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于用于密码验证的正则表达式,仅特定字符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

用于验证特定模式的正则表达式

正则表达式验证模式只允许一个字符[重复]

用于密码的javascript正则表达式,包含至少8个字符、1个数字、1个大写和1个小写[重复]

密码验证Objective-C的正则表达式[重复]

用于仅从字符串中删除特定特殊字符的正则表达式

正则表达式密码验证 - Codewars [重复]