2013-06-05 4 views
1

Я огляделся вокруг stackoverflow и т. Д., Но не нашел для этого хорошего ответа. Поддерживает ли регулярное выражение такое правило? Если так, есть какие-либо специалисты по регулярному выражению, которые могут помочь мне написать это, я большой newb для регулярного выражения и в момент хруста ...Regex для комплексной проверки пароля

Я знаю, что могу сделать это с помощью ручной функции в C# с помощью C# char методы номер, но я хотел бы использовать регулярное выражение, если я могу за это ..

Требование:

  • по крайней мере 8 символов
    • 2 буквы
    • 2 цифры
    • 1 Верхний регистр
    • 1 строчное
    • 1 Символ
+6

Если это настоящие правила, которые вы собираетесь использовать, я вас ненавижу. :) – Rotem

+0

Я не составлял эти правила :) – kyleb

+1

Точно 8 символов или не менее 8 символов? – invisal

ответ

12

Вы можете использовать это регулярное выражение

^(?=(.*\d){2})(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z\d]).{8,}$ 
    --------- --------------------- --------------- ----- 
     |    |     |   |->match 8 or more characters 
     |    |     |->match further only if theres anything except letter or digit 
     |    |->match further only if there is an upper-lower case letter 
     | 
     |->match further only if there are two digits anywhere 

Demo

+4

есть причина, по которой вы все еще редактируете свой ответ. :) –

+0

Это не работает вообще. –

+0

@Anirudh - Ах после редактирования, он работает сейчас. Я бы не использовал его, кроме '+ 1', чтобы взломать это вместе. –

16

Вы гораздо лучше писать простую процедуру проверки для пароля, который имеет все эти проверки.

Регулярное выражение не кажется лучшим (или наиболее расширяемым) решением для данной конкретной проблемы.

if(password.Length < 8) 
    return false; 

var letters = 0; 
var digits = 0; 
var uppers = 0; 
var lowers = 0; 
var symbols = 0; 
foreach(var ch in password) 
{ 
    if (char.IsLetter(ch)) letters++; 
    if (char.IsDigit(ch)) digits++; 
    .... 
} 

if(letters < 2) return false; 
... 
+0

В то время как регулярное выражение будет работать, это значительно более приемлемое решение. – emd

+0

Я склоняюсь к этому, но я хочу посмотреть, сможет ли кто-нибудь создать регулярное выражение, подобное этому ... – kyleb

+0

+1, приятный, мыслимый и более удобный, чтобы сравниваться с длинными регулярными выражениями. –

3

Я рекомендую идти по пути ответ Одед в сделал, но я думаю, что LINQ является более удобным для чтения и явный механизм проверки в этом случае.

string p = "psW%Rd32"; 
return p.Length >= 8 && 
    p.Count(c => char.IsDigit(c)) >= 2 && 
    p.Count(c => char.IsUpper(c)) >= 1 && 
    p.Count(c => char.IsLower(c)) >= 1) ... 
+1

Хотя мне это нравится, вы _are_ повторяетесь несколько раз над строкой (один раз за 'Count'). – Oded

+1

return p.Length == 8 неверно. вы должны иметь по крайней мере 8 символов –

+0

'+ 1' - хотя для струн потребуется много итераций, их легко читать и хорошо организовывать. –

3

Вы можете попробовать этот метод.

private bool ValidatePassword(string password, out string ErrorMessage) 
{ 
    var input = password; 
    ErrorMessage = string.Empty; 

    if (string.IsNullOrWhiteSpace(input)) 
    { 
     throw new Exception("Password should not be empty"); 
    } 

    var hasNumber = new Regex(@"[0-9]+"); 
    var hasUpperChar = new Regex(@"[A-Z]+"); 
    var hasMiniMaxChars = new Regex(@".{8,8}"); 
    var hasLowerChar = new Regex(@"[a-z]+"); 
    var hasSymbols = new Regex(@"[[email protected]#$%^&*()_+=\[{\]};:<>|./?,-]"); 

    if (!hasLowerChar.IsMatch(input)) 
    { 
     ErrorMessage = "Password should contain At least one lower case letter"; 
     return false; 
    } 
    else if (!hasUpperChar.IsMatch(input)) 
    { 
     ErrorMessage = "Password should contain At least one upper case letter"; 
     return false; 
    } 
    else if (!hasMiniMaxChars.IsMatch(input)) 
    { 
     ErrorMessage = "Password should not be less than or greater than 8 characters"; 
     return false; 
    } 
    else if (!hasNumber.IsMatch(input)) 
    { 
     ErrorMessage = "Password should contain At least one numeric value"; 
     return false; 
    } 

    else if (!hasSymbols.IsMatch(input)) 
    { 
     ErrorMessage = "Password should contain At least one special case characters"; 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 
+0

Мне нравится этот подход лучше. Спасибо – Najeeb

+0

@Najeeb Спасибо – Anurag

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