c# - 带有数字或特殊字符的密码复杂性正则表达式

标签 c# regex passwords

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

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

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

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

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

我非常感谢来自这些部分的正则表达式之神之一的建议。

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

最佳答案

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

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

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

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

关于c# - 带有数字或特殊字符的密码复杂性正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36132154/

相关文章:

C命令行密码输入

javascript - jQuery 密码生成器

javascript - Angularjs 1.30 密码验证。验证确认密码匹配

C# 编码风格 : comments

c - 使用正则表达式在C中提取字符串中的单词

Ruby:从顶部 -n1 输出获取 CPU (un)

java - java中复杂的字符串提取

c# - 我们需要在 Controller 中使用 async/await 关键字吗?

C# - 如何在函数中传递和运行方法?

c# - 如何通过正确安装创建完全可分发的 C# 应用程序?