Регулярное выражение для пароля. Ограничение специальных символов

Я пытаюсь иметь некоторые записи пароля в шаблонах формирования облаков AWS. И чтобы ограничить пароль альфа-числовыми символами и подмножеством специальных символов. Я попробовал следующее:

"^(?=.*?[AZ])(?=.*?[az])(?=.*?[0-9])(?=.*?[#@$?]).{8,}$" 

Это сообщает, что должен быть хотя бы один нижний и верхний регистр вместе с одной цифровой цифрой. Кроме того, ограничение специального набора символов на [#@$?]

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

Таким образом, Hello*E1 запрещен, но HelloE1* разрешен.

Как запретить все специальные символы, кроме [#@$?] Независимо от того, где они появляются?

Кроме того, как запретить весь специальный набор символов? "^(?=.*?[AZ])(?=.*?[az])(?=.*?[0-9]).{8,}$ не помогло, что позволило использовать все специальные символы ,

Любая помощь приветствуется.

  • sed: игнорировать строку, начинающуюся с пробела для соответствия
  • Что означает \ bi \ b в виде grep?
  • Sed: замена цифр
  • Почему это добавляет пробелы? echo "x ax" | sed 's / x \ s * / x /'
  • regexp в ksh для расширений tgz, tar.tgz
  • Изменение формата валюты на общий номер с помощью sed
  • Как я могу извлечь / проанализировать полный URL-адрес из полуслучайной строки?
  • RegEx в bash для извлечения строки после первого разделителя
  • 3 Solutions collect form web for “Регулярное выражение для пароля. Ограничение специальных символов”

    Regex:

     ^(?=[a-zA-Z0-9#@$?]{8,}$)(?=.*?[az])(?=.*?[AZ])(?=.*?[0-9]).* 

    Объяснение:

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

    • (?=.*?[AZ]) : Сопоставьте хотя бы одну прописную букву.
    • (?=.*?[az]) : Сопоставьте хотя бы одну строчную букву.
    • (?=.*?[0-9]) : Сопоставьте хотя бы одно число.
    • (?=.*?[#@$?]) : Сопоставьте хотя бы один из следующих символов: #@$?
    • .{8,} : сопоставить любой символ не менее 8 раз.

    Но есть как минимум два недостатка:

    • Часть (?=.*?[#@$?]) нужна, поскольку эти специальные символы должны быть необязательными, а не обязательными [1].

    • Как я уже говорил, вы не указали реальный фильтр, поэтому благодаря части .{8,} ваше регулярное выражение будет принимать любую строку, если оно соответствует условиям, установленным lookaheads, даже если оно имеет нежелательные специальные символы [ 1].

    Поэтому для устранения этих недостатков необходимо:

    • Удалите часть (?=.*?[#@$?]) .

    • Добавьте новый lookahead, который действует как фильтр, упомянутый выше.

    Чтобы создать этот фильтр, вы должны подумать «какие символы я хочу разрешить?» вместо «какие символы я хочу запретить?», потому что это более простой сценарий для обработки в этом конкретном случае. Если вы говорите, что хотите только az , AZ , 0-9 и #@$? чтобы быть вашими разрешенными символами, тогда lookahead должен выглядеть следующим образом:

     (?=[a-zA-Z0-9#@$?]) 

    Но эй, на этом шаге вы даже можете установить минимальную длину и рассказать, где начать и где остановиться (начало и конец строки в этом случае):

     (?=[a-zA-Z0-9#@$?]{8,}$) 

    Я опустил здесь, потому что он уже в начале всего, поэтому нет необходимости быть лишним. Теперь мы просто собираем все взгляды и сопоставляем действительный пароль, используя .* Вместо .{8,} :

     ^(?=[a-zA-Z0-9#@$?]{8,}$)(?=.*?[az])(?=.*?[AZ])(?=.*?[0-9]).* 

    Заметка:

    1. Хотя, в регулярном выражении и примерах, которые вы предоставили, я действительно не знаю, почему: 1) #@$? не рассматривались как обязательные; 2) нежелательные символы разрешены только в конце строки, а не в другом месте. Возможно, это имеет какое-то отношение к движку regex, используемому AWS, потому что все работало так, как ожидалось, когда я сам тестировал его.

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

     ^(?=[0-9a-zA-Z#@\$\?]{8,}$)(?=[^az]*[az])(?=[^AZ]*[AZ])(?=[^0-9]*[0-9]).* 

    Объяснение:

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

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

    Поэтому для эффективности, удобочитаемости и «переносимости» я использую конструкцию ^[^x]*[x] .

    Теперь сломать остальное …

    ^ : Все привязано к началу

    (?=[0-9a-zA-Z#@\$\?]{8,}$) : Lookahead с 8 или более допустимыми символами между началом и концом строки.

    Следующие три используют один и тот же шаблон: lookahead, соответствующий нолю или более символа, не соответствующего требуемому символу, а затем требуемому символу. Все они привязаны к началу, поэтому эффект состоит в том, чтобы разрешить совпадение требуемого символа в любой позиции строки:

    (?=[^az]*[az]) : По крайней мере, один строчный регистр.

    (?=[^AZ]*[AZ]) : По крайней мере, один верхний регистр.

    (?=[^0-9]*[0-9]) : По крайней мере одна цифра.

    .* : Все выше – это взгляд, который не потребляет ничего, поэтому потребляйте все это здесь. Первый lookahead гарантирует, что вся строка является допустимым символом, так что это безопасно.

    Я не утверждаю, что это оптимизировано (за исключением исключения ленивого квантификатора). Это просто одна из самых простых форм для понимания.


    Примечание: причина проблемы, которую вы наблюдали с помощью #@$? обусловлено тем, что внешний вид не привязан к концу строки. Любой символ будет соответствовать после одного из четырех (и не обязательно в последней позиции). Конечно, вы не можете просто добавить $ с тех пор, а затем вытесните действительных символов. Вот почему я включаю все допустимые символы в один и тот же список.

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

     ^(?=.*?[AZ])(?=.*?[az])(?=.*?[0-9])(?=.*?[#@$?])[a-zA-Z0-9#@$?]{8,}$ 

    Обратите внимание: если это будет строка perl , вам нужно будет избежать $ s и @ s или использовать сильные кавычки ( '...' или q{...} ). Вы также хотите убедиться, что регулярное выражение работает в режиме ASCII ( az только английским буквам и соответствует любому байту).

    Удалите (?=.*?[#@$?]) Если вам не нужен хотя бы один из этих символов.

    Interesting Posts

    Как выйти из программы sh?

    bash terminal (время) не совпадает с часовым поясом, как 'date'

    Синтаксическая ошибка C Shell Script «неожиданный конец файла»

    Получение комбинированного подсчета всех вхождений строки в несколько каталогов?

    Список текущих часов inotify (путь, PID)

    Как исправить шрифты, отображаемые только жирным или курсивом после копирования Windows / Fonts?

    Список файлов из вложенного zip-файла без лишних

    Является ли использование сокращенной быстрой замены расширения истории проблематичным?

    Найти имена файлов, которые не содержат заданную строку

    Как я могу сделать спаривание программы 'ltunify' постоянной?

    Беспроводной контроллер Intel 8260 блокирует приостановку в ОЗУ в течение 10 секунд

    Как сделать резервную копию данных, на которые у меня нет разрешения?

    Можно ли получить столбец PWD в верхнем выпуске?

    Как удалить текст из строки после определенного символа с помощью awk

    Нет выхода, использующего параллель в тандеме с ag или ack

    Linux и Unix - лучшая ОС в мире.