# Методы RegExp и String
Регулярные выражения в JavaScript являются объектами класса [RegExp](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp).
Кроме того, методы для поиска по регулярным выражениям встроены прямо в обычные строки `String`.
К сожалению, общая структура встроенных методов слегка запутана, поэтому мы сначала рассмотрим их по отдельности, а затем -- рецепты по решению стандартных задач с ними.
[cut]
## str.search(regexp)
Этот метод мы уже видели.
Он возвращает позицию первого совпадения или `-1`, если ничего не найдено.
```js
//+ run
var str = "Люблю регэкспы я, но странною любовью";
alert( str.search( *!*/лю/i*/!* ) ); // 0
```
**Ограничение метода `search` -- он всегда ищет только первое совпадение.**
Нельзя заставить `search` искать дальше первого совпадения, такой синтаксис попросту не предусмотрен. Но есть другие методы, которые это умеют.
## str.match(regexp) без флага g
Метод `str.match` работает по-разному, в зависимости от наличия или отсутствия флага `g`, поэтому сначала мы разберём вариант, когда его нет.
В этом случае `str.match(regexp)` находит только одно, первое совпадение.
Результат вызова -- это массив, состоящий из этого совпадения, с дополнительными свойствами `index` -- позиция, на которой оно обнаружено и `input` -- строка, в которой был поиск.
Например:
```js
//+ run
var str = "ОЙ-Ой-ой";
var result = str.match( *!*/ой/i*/!* );
alert( result[0] ); // ОЙ (совпадение)
alert( result.index ); // 0 (позиция)
alert( result.input ); // ОЙ-Ой-ой (вся поисковая строка)
```
У этого массива не всегда только один элемент.
**Если часть шаблона обозначена скобками, то она станет отдельным элементом массива.**
Например:
```js
//+ run
var str = "javascript - это такой язык";
var result = str.match( *!*/JAVA(SCRIPT)/i*/!* );
alert( result[0] ); // javascript (всё совпадение полностью)
alert( result[1] ); // script (часть совпадения, соответствующая скобкам)
alert( result.index ); // 0
alert( result.input ); // javascript - это такой язык
```
Благодаря флагу `i` поиск не обращает внимание на регистр буквы, поэтому находит javascript
. При этом часть строки, соответствующая SCRIPT
, выделена в отдельный элемент массива.
Позже мы ещё вернёмся к скобочным выражениям, они особенно удобны для поиска с заменой.
## str.match(regexp) с флагом g
При наличии флага `g`, вызов `match` возвращает обычный массив из всех совпадений.
Никаких дополнительных свойств у массива в этом случае нет, скобки дополнительных элементов не порождают.
Например:
```js
//+ run
var str = "ОЙ-Ой-ой";
var result = str.match( *!*/ой/ig*/!* );
alert( result ); // ОЙ, Ой, ой
```
Пример со скобками:
```js
//+ run
var str = "javascript - это такой язык";
var result = str.match( *!*/JAVA(SCRIPT)/gi*/!* );
alert( result[0] ); // javascript
alert( result.length ); // 1
alert( result.index ); // undefined
```
Из последнего примера видно, что элемент в массиве ровно один, и свойства `index` также нет. Такова особенность глобального поиска при помощи `match` -- он просто возвращает все совпадения.
Для расширенного глобального поиска, который позволит получить все позиции и, при желании, скобки, нужно использовать метод [RegExp#exec](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec), которые будет рассмотрен далее.
[warn header="В случае, если совпадений не было, `match` возвращает `null`"]
Обратите внимание, это важно -- если `match` не нашёл совпадений, он возвращает не пустой массив, а именно `null`.
Это важно иметь в виду, чтобы не попасть в такую ловушку:
```js
//+ run
var str = "Ой-йой-йой";
// результат match не всегда массив!
alert( str.match( /лю/gi ).length ) // ошибка! нет свойства length у null
```
[/warn]
## str.split(regexp|substr, limit)
Разбивает строку в массив по разделителю -- регулярному выражению `regexp` или подстроке `substr`.
Обычно мы используем метод `split` со строками, вот так:
```js
//+ run
alert( '12-34-56'.split('-') ) // [12, 34, 56]
```
Можно передать в него и регулярное выражение, тогда он разобьёт строку по всем совпадениям.
Тот же пример с регэкспом:
```js
//+ run
alert( '12-34-56'.split(/-/) ) // [12, 34, 56]
```
## str.replace(regexp, newStr|function)
Швейцарский нож для работы со строками, поиска и замены любого уровня сложности.
Его простейшее применение -- поиск и замена подстроки в строке, вот так:
```js
//+ run
// заменить дефис на двоеточие
alert( '12-34-56'.replace("-", ":") ) // 12:34-56
```
**При вызове со строкой замены `replace` всегда заменяет только первое совпадение.**
Чтобы заменить *все* совпадения, нужно использовать для поиска не строку `"-"`, а регулярное выражение /-/g
, причём обязательно с флагом `g`:
```js
//+ run
// заменить дефис на двоеточие
alert( '12-34-56'.replace( *!*/-/g*/!*, ":" ) ) // 12:34:56
```
В строке для замены можно использовать специальные символы:
Спецсимволы | Действие в строке замены |
---|---|
`$$` | Вставляет `"$"`. |
`$&` | Вставляет всё найденное совпадение. |
$` |
Вставляет часть строки до совпадения. |
$'
|
Вставляет часть строки после совпадения. |
$*n*
|
где `n` -- цифра или двузначное число, обозначает `n-ю` по счёту скобку, если считать слева-направо. |