Oracle APEX POSIX-реализация REGEX для проверки пароля - PullRequest
3 голосов
/ 29 апреля 2011

Вероятно, за последние 4 часа я прочитал более 20 различных вариантов этого вопроса без каких-либо положительных результатов.

Я пытаюсь подтвердить пароль с помощью регулярных выражений в приложении Oracle APEX, которое, к моемуДля понимания используется реализация регулярного выражения POSIX, которая, по-видимому, является более "строгим" движком, чем большинство версий регулярного выражения ???(Я еще не смог проверить это конкретно, но мое тестирование заставило бы меня поверить, что это правда)

В конечном итоге мне нужно подтвердить пароль, который:

  • длиной от 14 до 18 символов
  • Имеет как минимум 1 символ нижнего регистра
  • Имеет как минимум 1 символ верхнего регистра
  • Имеет не менее 1 цифры
  • Имеетхотя бы 1 из следующих специальных символов # $ ^ + =! * () @% &

Я пробовал несколько выражений регулярных выражений, которые даже в их самой простой форме не работают в реализации Apex.

Например:

^\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*$

Теоретически следует принимать любую входную строку, если она имеет по крайней мере 1 цифру, 1 верхний регистр и 1 строчный символ.

Используя Javascript RegExp: тестер регулярных выражений , просто введя «wS1».Возвращает строку как совпадение.

Если я использую тот же RegExp для валидатора регулярных выражений и ввожу "wS1" в поле, проверка не пройдена.

Есть что-то, что яотсутствует в этой конкретной реализации регулярных выражений, о которых мне нужно знать?

РЕДАКТИРОВАТЬ

В конечном итоге я отказался от регулярных выражений из-за обширных возможностей проверки Apex.

Он имеет встроенную способность сказать что-то вроде: «Элемент в [expression1] должен содержать по крайней мере один из символов, перечисленных в [expression2]».К сожалению, это требует, чтобы я написал несколько проверок (сейчас мне до 6).

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

В целомМне все еще кажется, что это хак, и мне все еще интересно узнать секрет, стоящий за регулярным выражением.

1 Ответ

1 голос
/ 19 июля 2011

Это регулярное выражение должно работать для вас:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$^+=!*()@%&]).{14,18}$

Пояснение:

^                     #The Start of the string.
(?=.*[a-z])           #Any chars and then a lowercase.
(?=.*[A-Z])           #Any chars and then an uppercase.
(?=.*\d)              #Any chars and then a digit.
(?=.*[#$^+=!*()@%&])  #Any chars and then a char from the list.
.{14,18}              #After matching each of the previous, match 14 to 18 of any char.
$                     #The end of the String.

(?=) - группа поиска, которая проверяет, что это совпадение может быть выполнено, но ничего не фиксирует. после успеха он возвращается к предыдущей позиции в строке ... в этом случае ^ начало.

...