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 . Регулярные выражения

