用于密码验证的正则表达式,仅特定字符 [重复]
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);
【讨论】:
以上是关于用于密码验证的正则表达式,仅特定字符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章