Проверка пароля с помощью кода Delphi
Нужно реализовать диалог конечного пользователя, который требует от них создать свой собственный пароль.
Должно быть 9 символов в длину. 1 символ должен быть в верхнем регистре, 1 должен быть в нижнем регистре, один должен быть числом, ['0'..'9'] и один должен быть из набора из 6 предопределенных символов ascii. ['!','#','%','&','*','@'].
Завершите это. и работает. Однако я хотел предоставить видимую проверку с помощью события onchange, чтобы изменить цвет поля редактирования на зеленый, если все требования выполнены, или КРАСНЫЙ, если нет. Проверка длины 9 символов достаточно легка, однако проверка 9 различных символов, чтобы убедиться, что есть по крайней мере 1 верхний, 1 нижний, 1 число и 1 из предопределенных, оказывается немного трудной. Может кто-нибудь помочь, пожалуйста? Спасибо.
Это код:
procedure TPasswordForm.edtPassword1Change(Sender: TObject);
begin
if Length(edtPassword1.Text <> 9 then
edtPassword1.Color := clRed
else
edtPassword1.Color := clLime;
end;
2 ответа
Для фиксированных наборов символов функция может быть довольно простой. Обратите внимание, что он не принимает нелатинские символы.
function IsPasswordCrazy(const s: AnsiString): Boolean;
const
C_Upcase = 1;
C_Locase = 2;
C_Digit = 4;
C_SpecSym = 8;
C_All = C_Upcase or C_Locase or C_Digit or C_SpecSym;
var
i, keys: integer;
begin
if Length(s) <> 9 then begin
Result := False;
Exit;
end;
keys := 0;
for i := 1 to Length(s) do
case s[i] of
'A'..'Z': keys := keys or C_Upcase;
'a'..'z': keys := keys or C_Locase;
'0'..'9': keys := keys or C_Digit;
'!','#','%','&','*','@': keys := keys or C_SpecSym;
end;
Result := keys = C_All;
end;
Это может быть достигнуто с помощью регулярных выражений
Вот пример с сообщениями об ошибках.
uses
System.RegularExpressions;
function ValidatePassword(aPassword: String; var ErrorMessage: String): Boolean;
begin
Result := false;
ErrorMessage := '';
if Length(aPassword) <> 9 then
begin
ErrorMessage := 'Password must be exactly 9 characters long';
exit;
end;
if not TRegEx.IsMatch(aPassword, '[a-z]') then
begin
ErrorMessage := 'At least 1 character in the password must be lowercase';
exit;
end;
if not TRegEx.IsMatch(aPassword, '[A-Z]') then
begin
ErrorMessage := 'At least 1 character in the password must be uppercase';
exit;
end;
if not TRegEx.IsMatch(aPassword, '\d') then
begin
ErrorMessage := 'At least 1 character in the password must be a digit';
exit;
end;
if not TRegEx.IsMatch(aPassword, '[!,#,%,&,*,@]') then
begin
ErrorMessage := 'At least 1 character in the password must be one of the following letters: !,#,%,&,*,@';
exit;
end;
Result := True;
end;