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

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

          •  Строки перерабатываются слева направо.
          •  После переработки символа к нему больше не возвращаются.
          •  При отсутствии соответствия обработчик регулярного выражения переходит
             на один символ вперед и делает следующую попытку найти соответствие.
          •  Если соответствие найдено, обработчик регулярного выражения перерабатыва­
             ет все найденные символы сразу; поиск соответствия продолжается со следую­
             щего символа (если регулярное выражение глобально, о чем речь пойдет позже).
          Это общий алгоритм, и  нет  ничего  удивительного в том, что подробности ока­
       жутся намного сложнее. В частности,  алгоритм может быть прерван, если обработ­
       чик регулярного выражения посчитает, что соответствий больше не будет.
          Когда мы перейдем к специфическим особенностям метаязыка регулярных выра­
       жений, постарайтесь вспомнить этот алгоритм; представьте, что ваши строки пере­
       рабатываются слева направо, по одному символу за раз, пока не встретится соответ­
       ствие, и тогда перерабатываются сразу все найденные символы.


       Ч е р едован и е

          Предположим, у вас есть НТМL-страница, сохраненная в строковой переменной,
       и вы хотите найти все дескрипторы, способные ссылаться на внешний ресурс (<а>,
               <
                      <
       < a rea>,  l ink>,  s c ript>, <source>, а иногда и <meta>). Кроме того, некоторые из
       дескрипторов могут быть записаны в смешанном регистре ( <Area>, <LINKS> и т.д.).
       Для решения этой задачи с помощью регулярных выражений применяют чередова­
       ние (alternation).
       const  html  =  ' H TML  with  <а  href=" /one" > one  link</a>,  and  some  JavaScript .  '    +
           ' < script  src=" stuff . j s "></script> ' ;
       const  matches  =  html . m atch ( / area J a  l l i nk l script l source/ig)  ;    / /  первая  попытка
          Вертикальная черта (  J ) является метасимволом регулярного выражения, что оз-
       начает чередование. Суффикс ig указывает игнорировать регистр (i) и искать гло­
       бально (g). Без опции g будет возвращено только первое соответствие. Это читалось
       бы так: "Найти все варианты текста area, а,  i nk, script или source, игнорируя ре­
                                               l
       гистр". Проницательный читатель мог бы задаться вопросом "Почему мы поместили
       area перед а?" Это связано с тем, что обработчик регулярного выражения выполняет
       операцию чередования слева направо. Другими словами, если в строке есть дескрип­
       тор  r ea, то будет найдено только соответствие букве а и произойдет переход. Затем
           a
       символ а перерабатывается, а строка rea не соответствует ничему искомому. Таким


       276     Глава 1 7 . Регулярные выражения
   268   269   270   271   272   273   274   275   276   277   278