Page 288 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 288
Хотя это и хороший пример, здесь упреждения можно и не использовать. Упреж
дения необходимы, когда содержимое перекрывается; они могут также упростить
определенные типы поиска.
Классический пример - проверка соблюдения некой политики при выборе па
ролей. Для простоты предположим, что наш пароль состоит только из букв и цифр,
и что он должен содержать по крайней мере одну прописную букву, число и строч
ную букву. Конечно, мы могли бы использовать несколько регулярных выражений.
function validPassword ( p ) {
return / [ A-Z ] / . t e s t ( p ) & & / / по крайней мере одна прописная буква
/ [ 0 - 9 ) / . t e s t ( p ) & & 1 1 по крайней мере одна цифра
/ [ a-z] / . t e s t ( p ) & & 1 1 по крайней мере одна строчная буква
! / [ лa-zA-Z0-9 ) / . t est ( p ) ; 1 1 только буквы и цифры
Давайте объединим это в одно регулярное выражение. Наша первая попытка про
валится.
function val idPassword ( p ) {
return / [A- Z ] . * [ 0 - 9 ) [ a - z ] / . test (р) ;
Это выражение не только требует, чтобы прописная буква располагалась перед
цифрой и строчной буквой, но и не позволяет распознать запрещенные символы во
обще. И действительно нет никакого разумного способа сделать это хотя бы потому,
что символы будут переработаны в процессе обработки регулярного выражения.
Здесь нам на помощь приходят упреждения. По существу, каждое упреждение -
это независимое регулярное выражение, которое не перерабатывает входные данные.
Упреждения в JavaScript выглядят как ( ? =<подвыражение> ) . Есть также "негативное
упреждение" (negative lookahead): ( ? ! < подвыражение> ) , оно будет распознавать толь
ко то, что не соответствует подвыражению. Теперь мы можем написать единое ре
гулярное выражение для проверки наших паролей.
function validPassword ( p ) {
(
/
-
[
return / ( ? = . * [A-Z ] ) ( ? = . * [ 0 - 9 ] ) ( ? = . * a - z ] ) ( ? ! . * [ л a-zA Z 0 - 9 ) ) . test р ) ;
Взглянув на эту абракадабру вы можете подумать, что та функция из несколь
ких регулярных выражений лучше или по крайней мере понятнее. В этом примере
я, вероятно, согласился бы с вами. Но в нем показан один из важнейших случаев ис
пользования упреждений (и негативных упреждений). Упреждения, определенно, от
носятся к категории "высшего пилотажа" в регулярных выражениях, но они важны
для решения определенных задач.
Упреждения 291

