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
   283   284   285   286   287   288   289   290   291   292   293