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