以下是我用来创建强密码的.NET正则表达式(这对我的项目密码要求不正确):
(?=^.{15,25}$)(\d{2,}[a-z]{2,}[A-Z]{2,}[!@#$%&+~?]{2,})
密码要求:
! @ # $ % & + ~ ?
他们不需要彼此相邻。按照我粘贴的正则表达式所需的特定顺序。
上述正则表达式需要这样的密码:12abCD!@QWertyP
它需要RE中的特定顺序......这不是我想要的!
这应该传递一个格式正确的RE,其中包含上面列出的规格:Qq1W!w2Ee#3Rr4 @ Tt5
我怎样才能消除他们彼此相邻的必要性? 显然,如果该人选择密码,密码应该是随机的。
答案 0 :(得分:10)
我认为你正在寻找的不仅仅是正则表达式的目的。
考虑这样的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;
}
答案 1 :(得分:3)
在经典代码中,这将更具可读性和可维护性:
伪代码将是:
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()
...
可能是您正在实施要求而不是影响它们,但我通常建议使用现有代码来估算这些要求。
答案 2 :(得分:2)
据我所知,你不能合理地做到这一点,这意味着你必须在正则表达式中列出所有可能的订单组合,这将最多组合24个。
我会做4次单独的检查:
\d{2,}
[a-z]{2,}
[A-Z]{2,}
[!@#$%&+~?]{2,}
相关问题:Variable order regex syntax
顺便说一句,你的规则对我来说太麻烦我会重新考虑它们,例如,有三个字符,两个字符,数字或符号。
答案 3 :(得分:1)
^(?=.*\d.*\d)(?=.*[a-z].*[a-z])(?=.*[A-Z].*[A-Z])(?=.*[!@#$%&+~?].*[!@#$%&+~?]).{15,25}$
这个正则表达式会做你想要的。它将通过您的密码字符串进行最多5次传递,但考虑到您正在使用它,我不认为这是一个问题。
修改了破坏正则表达式的拼写错误。
答案 4 :(得分:0)
要求每种字符类型中的一种,您可以使用:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%&+~?])^.{15,25}$
我不太确定如何将其转换为需要两种字符类型。
基本上,?=
将后缀与.*
匹配(即任何内容),但不会捕获任何内容,因此您可以检查是否满足指定顺序的所有条件。
答案 5 :(得分:0)
我认为也可以如下:
^(?=( \ d){2,})(?=(。 [AZ]){2,})(?=( [AZ]) (?=( [@#$%&安培!?; +〜]){2})。{2,})){15,25} $
答案 6 :(得分:0)
^((?=(.*\d){2,})(?=(.*[a-z]){2,})(?=(.*[A-Z]){2,})(?=(.*[!@#$%&+~?]){2,})).{15,25}$
我知道这已经有一年了,但是从少数回复中我得知这会起作用。
最佳答案是正确的,除了它只需要在模式之前的*。