5 KiB
Паттерны и флаги
Регулярные выражения –- мощное средство поиска и замены в строке.
В JavaScript регулярные выражения реализованы отдельным объектом RegExp
и интегрированы в методы строк.
[cut]
Регэкспы
Регулярное выражение (оно же "регэксп", "регулярка" или просто "рег"), состоит из паттерна (он же "шаблон") и необязательных флагов.
Синтаксис создания регулярного выражения:
var regexp = new RegExp("шаблон", "флаги");
Как правило, используют более короткую запись через слеши /
:
var regexp = /шаблон/; // без флагов
var regexp = /шаблон/gmi; // с флагами gmi (изучим их дальше)
Слэши '/'
говорят JavaScript о том, что это регулярное выражение. Они играют здесь ту же роль, что и кавычки для обозначения строк.
Использование
Основа регулярного выражения -- паттерн. Это строка, которую можно расширить специальными символами, которые делают поиск намного мощнее.
Если флагов и специальных символов нет, то поиск по паттерну -- то же самое, что и обычный поиск подстроки:
//+ run
var str = "Я люблю JavaScript!"; // будем искать в этой строке
var regexp = /лю/;
alert( str.search(regexp) ); // 2
Сравните с обычным поиском:
//+ run
var str = "Я люблю JavaScript!";
var substr = "лю";
alert( str.indexOf(substr) ); // 2
Как видим, то же самое, разве что для регэкспа использован метод [:String#search(reg)], а для строки [:String#indexOf(substr)]. Но это соответствие лишь кажущееся. Очень скоро мы усложним регулярные выражения, и тогда появятся отличия.
[smart header="Цветовые обозначения"] Здесь и далее используется следующая цветовая схема:
- регэксп (регулярное выражение) -
красный
- строка -
синий
- результат -
зеленый
Флаги
Регулярные выражения могут иметь флаги, которые влияют на поиск.
В JavaScript их всего три:
- `i`
- Если этот флаг есть, то регэксп ищет независимо от регистра, то есть не различает между `А` и `а`.
- `g`
- Если этот флаг есть, то регэксп ищет все совпадения, иначе -- только первое.
- `m`
- Многострочный режим.
Самый очевидный из этих флагов -- безусловно, i
.
Пример его использования:
//+ run
var str = "Я люблю JavaScript!"; // будем искать в этой строке
alert( str.search( *!*/ЛЮ/*/!* ) ); // -1
alert( str.search( *!*/ЛЮ/i*/!* ) ); // 2
- С регом `/ЛЮ/` вызов вернул `-1`, что означает "не найдено" (то же соглашение, что и `indexOf`),
- С регом `/ЛЮ/i` вызов нашёл совпадение на позиции 2, так как стоит флаг `i`, а значит "лю" тоже подходит.
Следующий, пожалуй, самый важный флаг -- это g
.
Мы рассмотрим его в следующей секции, вместе с основными методами поиска по регулярным выражениям в JavaScript.
Итого
- Регулярное выражение состоит из шаблона и необязательных флагов `g`, `i` и `m`.
- Поиск по регулярному выражению
/регэксп/
без флагов и спец. символов, которые мы изучим далее -- это то же самое, что и обычный поиск подстроки в строке. - Метод строки `str.search(regexp)` возвращает индекс, на котором найдено совпадение.