Паттерны и флаги

Регулярные выражения – мощное средство поиска и замены в строке.

В JavaScript регулярные выражения реализованы отдельным объектом RegExp и интегрированы в методы строк.

Регэкспы

Регулярное выражение (оно же «регэксп», «регулярка» или просто «рег»), состоит из паттерна (он же «шаблон») и необязательных флагов.

Синтаксис создания регулярного выражения:

var regexp = new RegExp("шаблон", "флаги");

Как правило, используют более короткую запись (шаблон внутри слешей "/"):

var regexp = /шаблон/; // без флагов
var regexp = /шаблон/gmi; // с флагами gmi (изучим их дальше)

Слеши "/" говорят JavaScript о том, что это регулярное выражение. Они играют здесь ту же роль, что и кавычки для обозначения строк.

Использование

Основа регулярного выражения – паттерн. Это строка, которую можно расширить специальными символами, которые делают поиск намного мощнее.

В простейшем случае, если флагов и специальных символов нет, поиск по паттерну – то же самое, что и обычный поиск подстроки:

var str = "Я люблю JavaScript!"; // будем искать в этой строке

var regexp = /лю/;
alert( str.search(regexp) ); // 2

Сравните с обычным поиском:

var str = "Я люблю JavaScript!";

var substr = "лю";
alert( str.indexOf(substr) ); // 2

Как видим, то же самое, разве что для регэкспа использован метод search – он как раз работает с регулярными выражениями, а для подстроки – indexOf.

Но это соответствие лишь кажущееся. Очень скоро мы усложним регулярные выражения, и тогда увидим, что они гораздо мощнее.

Цветовые обозначения

Здесь и далее в тексте используется следующая цветовая схема:

  • регэксп (регулярное выражение) – красный
  • строка – синий
  • результат – зеленый

Флаги

Регулярные выражения могут иметь флаги, которые влияют на поиск.

В JavaScript их всего три:

i
Если этот флаг есть, то регэксп ищет независимо от регистра, то есть не различает между А и а.
g
Если этот флаг есть, то регэксп ищет все совпадения, иначе – только первое.
m
Многострочный режим.

Самый простой для понимания из этих флагов – безусловно, i.

Пример его использования:

var str = "Я люблю JavaScript!"; // будем искать в этой строке

alert( str.search( /ЛЮ/ ) ); // -1
alert( str.search( /ЛЮ/i ) ); // 2
  1. С регом /ЛЮ/ вызов вернул -1, что означает «не найдено» (как и в indexOf),
  2. С регом /ЛЮ/i вызов нашёл совпадение на позиции 2, так как стоит флаг i, а значит «лю» тоже подходит.

Другие флаги мы рассмотрим в последующих главах.

Итого

  • Регулярное выражение состоит из шаблона и необязательных флагов g, i и m.
  • Поиск по регулярному выражению без флагов и спец. символов, которые мы изучим далее – это то же самое, что и обычный поиск подстроки в строке. Но флаги и спец. символы, как мы увидим далее, могут сделать его гораздо мощнее.
  • Метод строки str.search(regexp) возвращает индекс, на котором найдено совпадение.
Карта учебника

Комментарии

перед тем как писать…
  • Приветствуются комментарии, содержащие дополнения и вопросы по статье, и ответы на них.
  • Для одной строки кода используйте тег <code>, для нескольких строк кода — тег <pre>, если больше 10 строк — ссылку на песочницу (plnkr, JSBin, codepen…)
  • Если что-то непонятно в статье — пишите, что именно и с какого места.