Page 283 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 283

что мы хотим отбросить все лишнее из дескриптора <а> и оставить только его URL,
       указанный в атрибуте href.
                               e
       let  html  =  ' < а  class="nop "   href " / y ep" >Yep</a ' ;
                                                   >
                                      =
       html  =  html . r eplace ( / <a  . * ? ( h ref=" . * ? " )   . * ? > / ,    ' < а  $ 1 > ' )  ;
          Подобно обратным ссылкам, всем группам присваиваются номера начиная с  1 .
       В самом регулярном выражении  ы   обращаемся к первой группе как к  \ 1 ;   в стро­
                                     м
       ке для замены мы должны использовать $ 1 .   Обратите внимание на использование
       в этом регулярном выражении ленивых квалификаторов, чтобы оно не распростра­
       нялось на несколько дескрипторов < а > .  Это регулярное выражение не сработает,
       если в атрибуте hre f будут использоваться одинарные кавычки вместо двойных.
          Давайте дополним пример. Сохраним только атрибуты class и href и ничего более.
       let  html  =  ' < а  class="yep"  href " / y ep"  id " n ope " > Yep</a> ' ;
                                     =
                                               =
       html  =  html . r eplace ( / <a  . * ? ( c lass=" . * ?" ) . * ? ( h ref=" . * ? " ) . * ? >/ ,  ' < а  $2  $ 1 >  ' )  ;
          Обратите внимание: в этом регулярном выражении мы изменяем порядок следо­
       вания атрибутов class и href на обратный, чтобы первым шел атрибут href. Проб­
       лема этого регулярного выражения в том, что если атрибуты class и href не рас­
       полагаются друг за другом (как уже упоминалось выше), а также, если в них будут
       использоваться одинарные кавычки вместо парных, оно не сработает. В следующем
       разделе мы увидим еще более сложное решение.
          Кроме выражений  $ 1 ,  $ 2 ,   существуют также  $ '   (все перед соответствием),  $ &
       (само соответствие) и $ '   (все после соответствия). Если вы хотите использовать ли­
       теральный знак доллара, используйте $ $ .
       const  input  =  "One  two  three" ;
                        o
       input . r eplace ( / tw / ,    '  ( $  ' ) ' ) ;     / /   "Опе  (Опе  )  three "
       input . r eplace ( / \ w+/g,  '  ( $ & )   ' ) ;    / /   "  ( One)  (two)  (three) "
       input . r eplace ( / two / ,   "  ( $ ' ) " )  ;     1 1   "Опе  (  three)  three"
       input . r eplace ( / two/ ,   "  ( $ $ ) " ) ;   1 1   "Опе  ($)  three "
          Этими макросами замены  часто  пренебрегают,  но я  видел  их использование
       в очень хитрых решениях, так что не забывайте о них!

       Функции замены

          Это мое любимое средство регулярных выражений, которое зачастую позволяет
       разделять очень сложные регулярные выражения на несколько более простых.
          Давайте снова рассмотрим  практический пример  изменения элементов НТМL­
       кода. Предположим, что вы пишете программу, которая преобразовывает все ссыл­
       ки <а> в  очень специфический формат: вы хотите  сохранить  атрибуты c l a s s ,   i d
       и  href, н о   удалить все остальные. Проблема в том, что код на входе может быть
       беспорядочным. Атрибуты присутствуют не всегда, а когда они есть, вы не можете



       286      Глава 1 7 . Регулярные выражения
   278   279   280   281   282   283   284   285   286   287   288