2010-09-26 3 views
2

У меня есть подтверждение пароля на regex.This мое выражение:Пароль сильно - не требует каждое условие

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$ 

Он работает - пароль должен содержать, по крайней мере, 1 цифру, по меньшей мере, 1 строчной буквой, по крайней мере, 1 буква верхнего регистра и, по крайней мере, специальный символ: @#$%^&+=. Поэтому я должен ввести все эти символы.

Но я хотел бы пароль, который имеет комбинацию по крайней мере 3, не все 4.
Таким образом, эти пароли должны быть хорошо:

2Df (не специальный символ), dF# (не цифра), a4% (не верхний регистр). Я хотел бы спросить, как должно выглядеть выражение регулярного выражения? Я мог бы написать каждое выражение, чтобы проверить каждую комбинацию, например:

  • не включают цифры: ^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
  • Не включать верхний регистр: ^(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=]).*$

Но, может быть, я могу сделать это в одном выражении.

+0

На каком языке вы это делаете? –

ответ

1

Если вы должны сделать это с регулярными выражениями, я бы предложил (для ясности) проверить все четыре условия друг за другом. Для удобства чтения вы можете сначала найти \d в своем пароле, затем [a-z], затем [A-Z], а затем [@#$%^&+=] (хотя вместо этого вы можете использовать [\W_], чтобы разрешить больше, чем просто несколько лишних символов). Затем проверьте, работало ли как минимум три из них.

Если есть сделать это в одном регулярном выражении, вы могли бы использовать чередование:

^((?=.*[a-z])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])|(?=.*[\W_])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[\W_])(?=.*\d)).*$ 

, но это просто некрасиво.

3

Почему вы использовали регулярное выражение для этого? Просто перебирайте строку пароля и подсчитывайте количество желаемых типов символов. В PHP вы можете использовать функцию типа count_chars().

Псевдо код, который:

 foreach(password as char) { 
     if (is_digit(char)) 
      digits++; 
     if (is_specialchar(char)) 
      special++; 
     if (is_lower(char)) 
      lower++; 
     if (is_upper(char)) 
      upper++; 
     //etc 
     } 

Теперь вы можете определить, какие требования вы хотите

 if (dgits > 0) and (lower > 0) and (special > 0) 
     passowrd_ok() 
     else 
     password_bad() 

в вашем случае вы можете бойко рассчитывать

 if (lower > 0) 
     diversity++; 
    if (upper > 0) 
     diversity++; 
    if (special > 0) 
     diversity++; 
    if (digit > 0) 
     diversity++; 

    if (diversity >= 3) //at least 3 different types of characters in password 
     pass_ok() 
+0

Спасибо за ваш ответ. Я должен проверить пароль на сайте ASP (не .NET), поэтому я считаю, что лучшим решением является регулярное выражение. – luk4443

+1

@ luk4443: почему, черт возьми? Вы можете перебирать строку в VB, C# или что угодно. В VB цикл равен «For i = 0 To s.Length - 1», и доступ к каждому символу возможен с помощью 's.Chars (i)' или 'Mid (s, i, 1)' – doc

+0

OK, спасибо, я тест. – luk4443

Смежные вопросы