Хотя это немного громоздко, это может быть выполнено в одном регулярном выражении, например так:
Dim myRegExp
Set myRegExp = New RegExp
myRegExp.Pattern = "^(?=.{12})(?![0-9])(?:(?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]))[A-Za-z0-9-_$#]+$"
If myRegExp.Test(SubjectString) Then
' Successful match
Else
' Match attempt failed
End If
Вот прокомментированная версия регулярного выражения: (в синтаксисе режима свободного пробега PHP - который может быть прочитан простыми смертными):
$re_password = '/
# Match password having multiple, specific requirements.
^ # Anchor to start of string.
(?=.{12}) # Password must be at least 12 characters long.
(?![0-9]) # Password must not begin with a number.
(?: # Password must have 3 out of 4 characteristics:
# Either... Case 1: (All but R1).
(?=[^a-z]*[a-z]) # R2: At least one lower case letter (a-z).
(?=[^0-9]*[0-9]) # R3: At least one number (0-9).
(?=[^-_$\#]*[-_$\#]) # R4: At least one of: [-_$#].
| # Or... Case 2: (All but R2).
(?=[^A-Z]*[A-Z]) # R1: At least one upper case letter (A-Z).
(?=[^0-9]*[0-9]) # R3: At least one number (0-9).
(?=[^-_$\#]*[-_$\#]) # R4: At least one of: [-_$#].
| # Or... Case 3: (All but R3).
(?=[^A-Z]*[A-Z]) # R1: At least one upper case letter (A-Z).
(?=[^a-z]*[a-z]) # R2: At least one lower case letter (a-z).
(?=[^-_$\#]*[-_$\#]) # R4: At least one of: [-_$#].
| # Or... Case 4: (All but R4).
(?=[^A-Z]*[A-Z]) # R1: At least one upper case letter (A-Z).
(?=[^a-z]*[a-z]) # R2: At least one lower case letter (a-z).
(?=[^0-9]*[0-9]) # R3: At least one number (0-9).
) # End group of 3-out-of-4 alternatives.
[A-Za-z0-9-_$\#]+ # Match the password string.
$ # Anchor to end of string.
/x';
Предполагается, что пароль не может содержать символы, отличные от [A-Z]
, [a-z]
, [0-9]
и [-_$#]
. Также предполагается, что пароль может содержать символы всех 4 типов.
: «3 из 4 требований» решается здесь грубой силой (путем явного указания всех возможных комбинаций падежей в качестве группы альтернатив - и повторения общих выражений для каждого случая). Это работает здесь, потому что есть только 4 возможных случая для тестирования, но этот метод становится очень громоздким, если есть дополнительные требования (например, "должно соответствовать 5 из 20 требований ..." ). Как уже говорили другие, есть определенные преимущества для разделения на несколько частей, например, Вы можете получить пользовательское сообщение об ошибке с каждым режимом сбоя.
Но это может быть выполнено с помощью одного регулярного выражения!
Редактировать 2011-10-20: Повышена эффективность 4 условных выражений требований путем замены ленивых звездочек на более точные жадные выражения.