我正在尝试使用.NET执行正则表达式,以获得强制执行Windows密码策略要求的密码:
1)长度至少为8个字符
2)包含以下4个类别中的3个字符:
我很棘手的部分是从上面的部分我只需要3个而不是4个规则。有谁知道如何存档?我的注册表在下面;
^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\W]).*$
答案 0 :(得分:2)
就个人而言,我使用单独的正则表达式设置所有四个规则,然后在代码中,我将检查四个匹配中的三个。
简单易读,即使对于那些使用正则表达式的人来说也是如此。 (并非所有的开发人员都对它们很好。让那些糟糕的维护开发人员轻松上手。)
如果其中一条规则发生变化,它也会简化事情。
答案 1 :(得分:1)
使用简单的VB.Net
结束以下代码;
Public Function IsPasswordInCorrectFormat(ByVal Password As String) As Boolean
Dim blnLowerLetter, blnUpperLetter, blnDigit, blnSpecials As New Boolean
Dim intCorrectSet As New Short
If Password.Length >= 8 Then
For Each chrLetter In Password.ToCharArray
If Not blnLowerLetter AndAlso Char.IsLower(chrLetter) Then blnLowerLetter = True : intCorrectSet += 1
If Not blnUpperLetter AndAlso Char.IsUpper(chrLetter) Then blnUpperLetter = True : intCorrectSet += 1
If Not blnDigit AndAlso Char.IsDigit(chrLetter) Then blnDigit = True : intCorrectSet += 1
If Not blnSpecials AndAlso (Char.IsSymbol(chrLetter) OrElse Char.IsSeparator(chrLetter) OrElse _
Char.IsWhiteSpace(chrLetter) OrElse Char.IsPunctuation(chrLetter)) Then blnSpecials = True : intCorrectSet += 1
If intCorrectSet >= 3 Then Exit For
Next
End If
Return intCorrectSet >= 3
End Function
答案 2 :(得分:0)
我喜欢这样做。 “按意图编程”。它比同等的正则表达式更容易理解。简单。也可能更快 - 只有一个通过字符串,没有回溯。
如果你也想要,这种方法可以很容易地定义有效性,其中包含你正在寻找的最少数量的角色类别中的角色...至少说明5中的3个。
/// <summary>
/// Determine password validity
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public bool IsPasswordValid(string password)
{
if ( password == null ) throw new ArgumentNullException() ;
const int MIN = 8 ;
const int MAX = 32 ;
bool meetsLengthRequirements = password.Length >= MIN && password.Length <= MAX ;
bool hasLeadingWhitespace = char.IsWhiteSpace( password[0] ) ;
bool hasTrailingWhitespace = char.IsWhiteSpace( password[ password.Length - 1 ] ) ;
bool hasUpperCaseLetter = false ;
bool hasLowerCaseLetter = false ;
bool hasNumericChar = false ;
bool hasSpecials = false ;
bool hasWhitespace = false ;
for (int i = 0; i < password.Length; ++i)
{
char ch = password[i];
hasUpperCaseLetter = char.IsUpper( ch ) ;
hasLowerCaseLetter = char.IsLower( ch ) ;
hasNumericChar = char.IsDigit( ch ) ;
hasWhitespace = char.IsWhitespace( ch ) ;
hasSpecials = char.IsPunctuation( ch )
|| char.IsSeparator( ch )
|| char.IsSymbol( ch )
;
}
bool isValid = !hasLeadingWhitespace
&& !hasTrailingWhitespace
&& hasUpperCaseLetter
&& hasLowerCaseLetter
&& hasNumericChar
&& ( hasSpecials || hasWhitespace )
;
return isValid ;
}