【问题标题】:Password complexity regex with number or special character带有数字或特殊字符的密码复杂性正则表达式
【发布时间】:2016-07-08 00:39:53
【问题描述】:

我有一些正则表达式可以检查传入密码的复杂性要求。但是它不够强大,无法满足我的需求。

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

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

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

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

我非常感谢一位正则表达式大神围绕这些部分提供的建议。

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

【问题讨论】:

标签: c# regex passwords


【解决方案1】:

如果我正确理解您的问题,您正在寻找需要另一个特殊字符的可能性。这可以按如下方式完成(参见最后的前瞻):

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

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

((?=\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 一个很好的密码。

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多