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

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

((?=.*\d)(?=.*[az])(?=.*[AZ]).{8,20}) 

它确保密码满足最小长度,包含两种情况的字符并包含一个数字。

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

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

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

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

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

 ((?=.*\d)(?=.*[az])(?=.*[AZ])(?=.*[!§$%&/(/)]).{8,20}) 

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

 ((?=\D*\d)(?=[^az]*[az])(?=[^AZ]*[AZ])(?=.*[!§$%&/(/)]).{8,}) 

使用第一种方法, 需要63个步骤 ,而优化版本只需要29个步骤 (一半!)。 关于你的第二个问题,允许数字特殊字符,你可以简单地使用交替( | ),如下所示:

 ((?:(?=\D*\d)|(?=.*[!§$%&/(/)]))(?=[^az]*[az])(?=[^AZ]*[AZ]).{8,}) 

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

 ((?=[^az]*[az])(?=[^AZ]*[AZ])(?=.*[\d!§$%&/(/)]).{8,}) 

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