Регулярное выражение - проверка пароля не работает - PullRequest
0 голосов
/ 09 июня 2010

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

Оно работает нормально, за исключением случаев, когда символ находится в конце строки.

Используемое мной регулярное выражение:

"^(?=.*\d.{2})(?=.*[A-Z].{1})(?=.*[@#$%^&+=].{2}).{8,12}$"

Правила:

  • минимальная длина = 8
  • минимальная заглавная буква = 1
  • минимальная цифра = 2
  • минимальный специальный символ = 1

Работает для Test123$$, Test$123, TEST123$s, Test123$1, Test12$3, но завершается ошибкой, если указанный символ находится в конце строкикак Test123$, Test$a12, Test12aa@, 123aa@@T.

Пожалуйста, дайте мне знать, если есть какое-либо решение для этого.

Ответы [ 5 ]

2 голосов
/ 09 июня 2010

В вашем регулярном выражении я вижу некоторые проблемы:

  • (?=.*\d.{2}) - почему второе ., вы не можете проверить два вхождения с {2}, потому что это предполагает, чтопоблизости ... Test1 $ 2 $ 3 тоже должно быть разрешено ...
  • (?=.*[A-Z].{1}) - почему второй .
  • (?=.*[@#$%^&+=].{2}) - и снова,почему второй ., почему вы проверяете на 2 вхождения?Спец говорит один особый символпроходит:
    Debug.Assert( regex.IsMatch( "Test123$" ) );
    Debug.Assert( regex.IsMatch( "Test123$$" ) );
    Debug.Assert( regex.IsMatch( "$Test1$2" ) );   // two numbers, not following
    Debug.Assert( regex.IsMatch( "Test$123" ) );
    Debug.Assert( !regex.IsMatch( "Test12$" ) );   // 7 chars
    Debug.Assert( !regex.IsMatch( "Test12345" ) ); // no special char
    Debug.Assert( !regex.IsMatch( "Test$$$$" ) );  // no number
    Debug.Assert( !regex.IsMatch( "Test$3$$" ) );  // only one number
    Debug.Assert( !regex.IsMatch( "test12$$" ) );  // no upper case
    
1 голос
/ 09 июня 2010

Ваша проблема в том, что вы используете (atom).{length}, а длина применяется к ., а не к atom.Вы должны использовать (atom){length}.И, во-вторых, \d{2} не является «минимальным числом: 2».Это «2 последовательные цифры».«Минимальное число: 2» выглядит следующим образом: .*\d.*\d, поэтому полное регулярное выражение (обратите внимание, что (atom){1} и (atom) являются одинаковыми регулярными выражениями):

^(?=.*\d.*\d)(?=.*[A-Z])(?=.*[@#$%\^&+=]).{8,12}$

И, пожалуйста, замените {8,12} с {8,}: вы не должны запрещать пользователям вводить длинные пароли.

0 голосов
/ 09 июня 2010

Хотя вы не говорите, какой тип регулярного выражения вы используете, я бы предложил следующий подход, который, если не самый эффективный, более читабелен и удобен в обслуживании (например, с использованием только Python):

>>> import string
>>> def valid(s):
    return 8 <= len(s) <= 12 and \
           any(c in string.ascii_uppercase for c in s) and \
           sum(c in string.digits for c in s) >= 2 and \
           any(c in string.punctuation for c in s)

>>> valid('abcdefA')
False
>>> valid('123aa@@T')
True
>>> valid('Test123$')
True
>>> valid('Test123_')
True
0 голосов
/ 09 июня 2010

вы не можете сделать конечный автомат для этого, поэтому (если на практике нет регулярных выражений, отличных от теоретических), вы не сможете найти регулярное выражение для этого.

главным образом потому, что он включает в себя подсчет, который требует «памяти», чего нет у конечного автомата.

edit: по-видимому, были достигнуты успехи в "технологии" DFA.см. комментарии к этой записи.

0 голосов
/ 09 июня 2010

В вашем списке требований не указан обычный язык.Таким образом, будет трудно (если не невозможно) сопоставить с помощью регулярного выражения.

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