2016-09-09 5 views
2

, используя Expect, как я могу проверить, имеет ли данный вход хотя бы один верхний регистр, по крайней мере один строчный регистр и хотя бы одно число или «! - % # "? Для аналогичного вопроса, где минимальное количество входной строки 10, кто-то ответилокак ожидать соответствия шаблону с по крайней мере одним номером, одним нижним регистром, одним верхним регистром

expect ^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])([!-%#])*.{10,}$ 

Как я новичок в Tcl и Expect, может кто-нибудь объяснить, как работает этот код? Почему это не работает, если мы удаляем {10,}, чтобы удалить минимальный лимит?

+0

Итак, вы просто спросите, как удалить минимальный лимит? Замените '{10,}' на '*'. BTW, регулярное выражение будет проверять * хотя бы одно число ** ИЛИ ** "! -% #" *. Что вы подразумеваете под * необязательным * в * по крайней мере одним номером и необязательным?! -% # "*? Вы можете просто удалить их из списка, если вы их не требуете. –

+0

@Wiktor На самом деле мне нужна работа всего кода ... и ваше предложение работало для снятия ограничения ... Спасибо – joe

+0

@Wiktor, который был опечаткой ... Отредактировано – joe

ответ

2

Миним предел не может быть удалена путем удаления лимитирующим (связанно) квантор {10,}, вам нужно заменить его * (разрешить пустую строку) или + (требовать по меньшей мере, 1):

expect ^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9#[email protected]$%^&*-]).*$ 

или просто (с expect не требует полного совпадения строки):

expect ^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9#[email protected]$%^&*-]) 

Если вам необходимо ограничить символы для тех, кто внутри lookaheads, просто замените .* с [a-zA-Z0-9#[email protected]$%^&*-]*:

expect ^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9#[email protected]$%^&*-])[a-zA-Z0-9#[email protected]$%^&*-]*$ 
                ^^^^^^^^^^^^^^^^^^^^^ 

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

Детали:

  • ^ - начало строки
  • (?=.*[A-Z]) - после любых 0+ символов должно быть в верхнем регистре ASCII буква
  • (?=.*[a-z]) - после любых 0+ символов должно быть строчная ASCII-буква
  • (?=.*[0-9#[email protected]$%^&*-]) - после любых символов 0+ должна быть цифра ASCII или любой из специальных символов, определенных в символе класс
  • .* - любые 0+ символов, максимально возможное до
  • $ - конец строки.

В (?=...) конструкции называются положительные lookaheads, что «стоять на своем», т.е. не продвигать индекс регулярных выражений, когда они выполняются. Таким образом, 3 вида будут выполнять проверку один за другим, и как только один из них вернет false, весь матч будет провален.

Примечание: во избежание ненужного обратного отслеживания с помощью .* вы можете применить принцип контраста (т.используя соответствующие отрицательные классы символов внутри в lookaheads):

^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9#[email protected]$%^&*-]*[0-9#?!‌​@$%^&*-])[a-zA-Z0-9#‌​[email protected]$%^&*-]*$ 

[^A-Z]* будет соответствовать один или несколько отличных заглавных букв ASCII символов, [^a-z]* будет соответствовать один или несколько отличных строчных букв ASCII символов и т.д. .* выхватывает сначала целую строку, а затем назад, проверяя, может ли следующий подшаблон соответствовать. Таким образом, классы с отрицанием символов намного эффективнее и быстрее находят или не дают результата.

+0

Мне кажется, что код должен искать верхний регистр, предшествующий любым персонажем в первой части, нижний регистр, которому предшествует любой символ во второй части, номер, которому предшествует любой символ в третьей части и необязательный! -% # в последней части ... Можете ли вы прояснить, почему это не как это? – joe

+0

Я добавил объяснение того, как выглядят взгляды. Таким образом, двигатель регулярных выражений будет оставаться в самом начале и выполнять три проверки с самого начала. Как только он получит 3 подтверждения, что он может соответствовать всей строке, он будет. –

+0

Спасибо, Виктор, очень помог мне стать новичком ... Почему мы используем. * В конце, так как мы выполнили все наши необходимые проверки? Также как изменить код так, чтобы он состоял только из вышеуказанных ограничений ... т.е. не что иное, как прописные, строчные, числовые и! - #%. В настоящее время у него может быть что-то другое, кроме этого тоже правильно? – joe