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

