Поиск буквенно-цифровых паролей в регулярных выражениях - PullRequest
1 голос
/ 10 июня 2019

Я пытался создать регулярное выражение, которое может определять буквенно-цифровые пароли длиной от 5 до 20 символов.Эти пароли могут содержать специальные символы (@$!%*#?&£).Мои попытки либо не обнаруживают все мои тесты, либо генерируют большое количество ложных срабатываний.

В настоящее время регулярное выражение выглядит так:

\b(?=.*[a-zA-Z])(?=.*\d*)(?=.*[@$!%*#?&£]*)[a-zA-Z\d@$!%*#?&£]{5,20}(?<![a-zA-Z ])\b

Вот мойRegex работает на Regexr с моими тестами

Критерии для Regex следующие:

  • Обнаружение смешанных буквенно-цифровых слов длиной от 5 до 20 символов
  • Обнаружение специальных символов (@$!%*#?&£ и т. Д.)

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

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

  • Определение слов как любых символов (включая специальные)
  • Поиск слов длиной от 5 до 20 символов
  • Проверьте, являются ли они буквенно-цифровыми (aA-zZ0-9!£$ и т. Д.)
  • Подбирайте только слова, удовлетворяющие этому критерию

Я не уверен, если я ', думая об этом правильно, явзглянул на другие буквенно-цифровые вопросы о пароле, и ответы не соответствовали моим тестам:

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 10 июня 2019

В вашем паттерне вы используете эти положительные взгляды (?=.*\d*)(?=.*[@$!%*#?&£]*), где то, что вы хотите утверждать, должно соответствовать 0+ раз цифре или специальному символу с использованием звездочки *.

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

Вы можете использовать якоря для подтверждения начала ^ и конец $ строки и пропустите *, чтобы сопоставить его хотя бы 1 раз, чтобы убедиться, что оно там есть.

Отрицательный взгляд за концом (?<![a-zA-Z ]) гарантирует, чтото, что слева - это не символ a-zA-Z или пробел.Вы можете опустить это, не допуская совпадения пробела.

Но применение этого правила не позволило бы сопоставить rese7FwDdvgfe, но в ваших примерах данных вы действительно хотите сопоставить его, чтобы вы могли исключить внешний вид из шаблона.

^(?=[^a-zA-Z\s]*[a-zA-Z])(?=(?:[^\d\s]*\d|[^\s@$!%*#?&£]*[@$!%*#?&£]))[@$!%*#?&£a-zA-Z\d]{5,20}$

Пояснение

  • ^ Начало строки
  • (?=[^a-zA-Z\s]*[a-zA-Z]) Утверждение верхнего или нижнего регистра az
  • (?= Позитивный прогноз
    • (?: Группа без захвата
      • [^\d\s]*\d Установить цифру
      • | Или
      • [^\s@$!%*#?&£]*[@$!%*#?&£] Установить специальный символ
    • ) Закрыть группу без захвата
  • ) Закрыть положительный прогноз
  • [@$!%*#?&£a-zA-Z\d]{5,20} Совпадение всех разрешенных 5 - 20 раз
  • $ Конец строки

Regex demo

0 голосов
/ 10 июня 2019
(?:^|[^a-zA-Z\d@$!%*#?&£])[a-zA-Z\d@$!%*#?&£]{5,20}(?:$|[^a-zA-Z\d@$!%*#?&£])

Вам нужно только начало строки ^ или не один из ваших сопоставимых символов [^a-zA-Z\d@$!%*#?&£], за которыми следуют от 5 до 20 сопоставимых символов [a-zA-Z\d@$!%*#?&£]{5,20}, за которыми следует конец строки $ или один несовпадающий символ [^a-zA-Z\d@$!%*#?&£] снова.

Регулярные выражения - это то, что вы не хотите, и то, что вы делаете

...