en.javascript.info/10-regular-expressions-javascript/1-regexp-introduction/article.md
2015-03-04 23:09:07 +03:00

106 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Паттерны и флаги
Регулярные выражения - мощное средство поиска и замены в строке.
В 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
```
Как видим, то же самое, разве что для регэкспа использован метод [search](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/search) -- он как раз работает с регулярными выражениями, а для подстроки -- [indexOf](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf).
Но это соответствие лишь кажущееся. Очень скоро мы усложним регулярные выражения, и тогда увидим, что они гораздо мощнее.
[smart header="Цветовые обозначения"]
Здесь и далее используется следующая цветовая схема:
<ul>
<li>регэксп (регулярное выражение) - <code class="pattern">красный</code></li>
<li>строка - <code class="subject">синий</code></li>
<li>результат - <code class="match">зеленый</code></li>
</ul>
[/smart]
## Флаги
Регулярные выражения могут иметь флаги, которые влияют на поиск.
В JavaScript их всего три:
<dl>
<dt>`i`</dt>
<dd>Если этот флаг есть, то регэксп ищет независимо от регистра, то есть не различает между `А` и `а`.</dd>
<dt>`g`</dt>
<dd>Если этот флаг есть, то регэксп ищет все совпадения, иначе -- только первое.</dd>
<dt>`m`</dt>
<dd>Многострочный режим.</dd>
</dl>
Самый очевидный из этих флагов -- безусловно, `i`.
Пример его использования:
```js
//+ run
var str = "Я люблю JavaScript!"; // будем искать в этой строке
alert( str.search( *!*/ЛЮ/*/!* ) ); // -1
alert( str.search( *!*/ЛЮ/i*/!* ) ); // 2
```
<ol>
<li>С регом `/ЛЮ/` вызов вернул `-1`, что означает "не найдено" (то же соглашение, что и `indexOf`),</li>
<li>С регом `/ЛЮ/i` вызов нашёл совпадение на позиции 2, так как стоит флаг `i`, а значит "лю" тоже подходит.</li>
</ol>
Следующий, пожалуй, самый важный флаг -- это `g`.
Мы рассмотрим его в следующей секции, вместе с основными методами поиска по регулярным выражениям в JavaScript.
## Итого
<ul>
<li>Регулярное выражение состоит из шаблона и необязательных флагов `g`, `i` и `m`.</li>
<li>Поиск по регулярному выражению <code class="pattern">/регэксп/</code> без флагов и спец. символов, которые мы изучим далее -- это то же самое, что и обычный поиск подстроки в строке.</li>
<li>Метод строки `str.search(regexp)` возвращает индекс, на котором найдено совпадение.</li>
</ul>