.NET正则表达式来创建强密码
下面是我用来创建强密码的.NET正则表达式(这不符合我的项目密码要求): 密码要求:.NET正则表达式来创建强密码,.net,regex,.net,Regex,下面是我用来创建强密码的.NET正则表达式(这不符合我的项目密码要求): 密码要求: (?=^.{15,25}$)(\d{2,}[a-z]{2,}[A-Z]{2,}[!@#$%&+~?]{2,}) 最少15个字符(最多25个) 两个数字 两个大写字母 两个小写字母 两个特殊字符!@$%&+~ 它们不需要彼此相邻&按照我粘贴的正则表达式所要求的特定顺序 上面的正则表达式需要这样的密码:12abCD@QWertyP 它要求他们在具体的顺序,在重新。。。这不是我想要的 这应该通过一个格式正确
(?=^.{15,25}$)(\d{2,}[a-z]{2,}[A-Z]{2,}[!@#$%&+~?]{2,})
!@$%&+~代码>
显然,如果用户选择,密码应该是随机的。我认为您要寻找的不仅仅是正则表达式的设计功能 考虑这样一个C#/VB方法:
bool IsStrongPassword( String password )
{
int upperCount = 0;
int lowerCount = 0;
int digitCount = 0;
int symbolCount = 0;
for ( int i = 0; i < password.Length; i++ )
{
if ( Char.IsUpper( password[ i ] ) )
upperCount++;
else if ( Char.IsLetter( password[ i ] ) )
lowerCount++;
else if ( Char.IsDigit( password[ i ] ) )
digitCount++;
else if ( Char.IsSymbol( password[ i ] ) )
symbolCount++;
}
return password.Length >= 15 && upperCount >= 2 && lowerCount >= 2 && digitCount >= 2 && symbolCount >= 2;
}
bool-IsStrongPassword(字符串密码)
{
整数上限=0;
int lowerCount=0;
int-digitCount=0;
int symbolCount=0;
for(int i=0;i=15&&upperCount>=2&&lowerCount>=2&&digitCount>=2&&symbolCount>=2;
}
据我所知,您不能合理地这样做,这意味着您必须在正则表达式中列出所有可能的顺序组合,这将增加到24个组合
我会做4个单独的检查:
\d{2,}
[a-z]{2,}
[A-Z]{2,}
[!@$%&+~?]{2,}
顺便说一句,您的规则对我来说太麻烦了,我会重新考虑它们,例如,3个字符包含两个字母、数字或符号。要要求每种字符类型中有一个,您可以使用以下方法:
(?=.*\d)(?=.[a-z])(?=.[a-z])(?=.[!@$%&+~?])^.{15,25}$
不过,我不太确定如何将其翻译成每种字符类型需要两个字符
基本上,?=
匹配*
的后缀(即任何内容),但不捕获任何内容,因此您可以检查是否满足指定顺序的所有条件
^(?=.*\d.*\d)(?=.*[a-z].*[a-z])(?=.*[A-Z].*[A-Z])(?=.*[!@#$%&+~?].*[!@#$%&+~?]).{15,25}$
这个正则表达式将执行您想要的操作。它将通过您的密码字符串传递多达5次,但考虑到您正在使用它做什么,我不认为这是一个问题
编辑以修复破坏正则表达式的打字错误。这将在经典代码中更具可读性和可维护性: 伪代码是:
int count_alpha = 0, count_digit = 0, count_symbol = 0, ...
for each ch in password:
if is_alpha(ch):
count_alpha += 1
elif is_digit(ch):
count_digit += 1
...
if (count_alpha < 2) or (count_digit < 2) or ...
rejection_message()
...
int count\u alpha=0,count\u digit=0,count\u symbol=0。。。
对于每个登录密码:
如果是α(ch):
计数α+=1
elif是数字(ch):
计数数字+=1
...
如果(计数α<2)或(计数数字<2)或。。。
拒绝消息()
...
可能是您正在实现需求,而不是影响需求,但我通常建议您评估entrophy并使用现有代码来实现它。我认为也可以如下所示: ^(?=(.-d){2,})(?=([a-z]){2,})(?=([a-z]){2,})(?=([a-z]){2,})(?=([a-z]$%&+~?]){2,})$ 我知道这已经是一年前的事了,但从少数几个回答中,我推断这是可行的
最上面的答案是正确的,只是在模式前面需要一个*而已。为什么要设置25个字符的上限?你没有把它存储在任何地方,是吗?很抱歉聊天,但根据“熵”选择最小密码长度并不是更明智的选择。例如-小写或大写40个字符,小写和大写30个字符,大写+小写+数字25个字符,所有可打印集最少15个字符。我个人总是讨厌我不得不逃避这样的限制。我同意其他经过投票的答案,这不适合regexYes,我们正在数据库中存储密码。我同意大多数人的看法,这对正则表达式不是一个好的用途,我已经使用了随机密码生成器来提供将为用户创建的密码,通过电子邮件发送给用户,并存储在数据库中。感谢您在这个问题上的出色贡献和辛勤工作!密码的最小值是15个字符,但我只是抓取了一个任意数字(25)作为上限。没有多少人想要15个字符的密码,更不用说25个字符了。如果你希望得到超长字符串,你可以创建一个变体,首先检查字符数。由于您仍要匹配整个字符串,因此字符计数步骤也可以是前瞻的一部分,这样您就不必重写表达式的任何其他部分。符号字符列表可以扩展为[!@$%&+-/`^)(| \=:;,}{~?]这需要两个数字(或同一组中的其他符号)在后续操作中,例如!%34dfZXaaaaaaaa将起作用,!%3DFZXAAAAAA1将不起作用。
^((?=(.*\d){2,})(?=(.*[a-z]){2,})(?=(.*[A-Z]){2,})(?=(.*[!@#$%&+~?]){2,})).{15,25}$