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

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

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

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

  • простая команда для удаления заголовка и нижнего колонтитула из файла
  • Простое использование суффикса адресной строки '/ M'?
  • Проблема регулярных выражений в Bash: , похоже, не работает
  • как найти файлы на основе диапазона имен файлов?
  • удалить завершающие нули в awk не работает. ошибка синтаксиса
  • Заключить несколько строк в цитате Vim
  • Я заметил, что любой особый персонаж, если он был последним, был разрешен. В любом другом месте оно было отклонено, как ожидалось

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

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

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

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

  • sed match word1 и word2, чтобы получить слово между ними
  • Как использовать регулярное выражение с отрицательным выражением?
  • Как оптимизировать «grep'-and-save»?
  • regexp в ksh для расширений tgz, tar.tgz
  • замените несколько запятых на одну или несколько наборов фигурных скобок и исключение, что в одном или нескольких наборах фигурных скобок
  • Простое регулярное выражение Bash соответствует отсутствующему символу (OS X)
  • 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 только английским буквам и соответствует любому байту).

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

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