密码复杂性正则表达式与数字或特殊字符

时间:2016-03-21 13:20:25

标签: c# regex passwords

我有一些正则表达式会检查传入密码的复杂性要求。然而,它不够强大,不能满足我的需求。

((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,20})

确保密码符合最小长度,包含两种情况的字符并包含数字。

但是我需要修改它,以便它可以包含数字和/或允许的特殊字符。我甚至得到了允许的特殊字符列表。

我有两个问题,分隔特殊字符并使第一个条件执行和/或匹配数字或特殊字符。

我非常感谢这些部分中的一个正则表达神的建议。

允许的特殊字符为:@%+\/'!#$^?:.(){}[]~-_

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你正在寻找另一个特殊角色的可能性。这可以按如下方式完成(见最后一个预测):

((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!§$%&/(/)]).{8,20})

regex101.com上查看此方法的演示 但是,通过进一步的批准,您可以使表达更加出色:点星(.*)会让您下线并在之后回溯。如果你有一个10个字符的密码并且你想确定,需要完成四个前瞻,你需要至少 40个步骤(甚至更多,因为引擎需要回溯)。登记/> 要优化表达式,您可以使用所需字符的完全相反,从而使引擎更快地结束。此外,正如评论中已经指出的那样,不要限制您的最大密码长度 在正则表达式的语言中,这将归结为:

((?=\D*\d)(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=.*[!§$%&/(/)]).{8,})

使用第一种方法63 steps are needed,而优化版只有needs 29 steps(一半!)。关于你的第二个问题,允许数字一个特殊字符,你可以简单地使用一个替换(|),如下所示:

((?:(?=\D*\d)|(?=.*[!§$%&/(/)]))(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z]).{8,})

或者也可以将\d放在括号中,如下所示:

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

这个会认为ConsideredAgoodPassw!rdC0nsideredAgoodPassword是一个很好的密码。