Создание регулярного выражения для проверки надежного пароля - PullRequest
2 голосов
/ 20 июля 2009

Скажем, у меня есть регулярное выражение, проверяющее буквенно-цифровые символы.

Теперь я хочу создать еще одно регулярное выражение, которое проверяет хотя бы 1 цифру в пароле. И я хочу проверить, имеет ли он хотя бы 1 не буквенно-цифровой символ (что-то отличное от буквы или цифры).

Должен ли я просто позвонить каждому из них по отдельности, а если не получится, вернуть false или есть способ объединить их в 1 звонок?

Ответы [ 7 ]

3 голосов
/ 20 июля 2009

Я бы написал маленькие методы, используя &&:

internal bool HasDigit(string password) { .. }
internal bool HasNonAlpha(string password) { .. }

bool IsStrong(string password) {  
   return HasDigit(password) && HasNonAlpha(password);
}   
3 голосов
/ 20 июля 2009

Зависит от того, какие именно критерии вы используете, но, вероятно, было бы лучше сделать один проход через строку и установить количество флагов в зависимости от того, что вы видели:

  • hasDigit
  • hasAlpha
  • hasSymbol
  • и т.д.

Затем используйте их в конце, чтобы решить, достаточно ли сложен пароль.

Еще лучше:

Как предполагает lexu, использование счетчиков вместо флагов даст большую гибкость.

2 голосов
/ 20 июля 2009

Я думаю, это то, что вы ищете:

^.{6,}(?<=\d.*)(?<=[^a-zA-Z0-9].*)$

(соответствует паролю с минимальной длиной 6, по крайней мере, с одной цифрой и одним не буквенно-цифровым символом)

В коде:

public bool PasswordOk(string pwd) 
{
    return Regex.IsMatch(pwd,@"^.{6,}(?<=\d.*)(?<=[^a-zA-Z0-9].*)$");
}
1 голос
/ 20 июля 2009

ИМХО, это вопрос стиля, делать ли одно или два утверждения из этого.

Почему бы не проверить это ни в одном из двух приказов, чтобы они могли появиться. (Как и в случае регулярных выражений, у нас нет чего-то вроде счетчика скобок или парантезов, поэтому мы должны соблюдать возможный порядок вещей.

Что можно использовать для perl:

(\d.*[^[:alnum:]])|([^[:alnum:]].*\d)

Может быть легче прочитать два высказывания, особенно потому, что тогда каждое семантическое условие встречается только один раз.

1 голос
/ 20 июля 2009

Вы должны использовать два звонка. Для более сложного тестирования вы можете использовать счетчик паролей . Он свободно доступен для распространения под лицензией GPL.

0 голосов
/ 15 мая 2016

Regex - не самый быстрый способ.

Дайте попробовать:

string Password = "Pass12!";

bool ValidPassword = Password.Any(char.IsDigit)
    && !Password.All(char.IsLetterOrDigit)
    && Password.Length >= 6;

Вместо:

string Password = "Pass12!";

bool ValidPassword = Regex.IsMatch(Password, @"^.{6,}(?<=\d.*)(?<=[^a-zA-Z0-9].*)$");

Если вы пройдете 1 миллион раз, это займет первые 157 мс, а второй 1251 мс.

И самое важное, что уже говорили другие: гораздо лучше поддерживать.

0 голосов
/ 20 июля 2009

Вы добавляете | (или) оператор в регулярное выражение, например

[0-9] | [A-Z]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...