Если вызвать метод match
без модификатора
g, то он найдет только первое совпадение
с регуляркой. Однако, вернет он все равно
массив - это будет массив, состоящий из найденного
совпадения, с дополнительными свойствами:
index
- позиция, на которой оно обнаружено
и input
- строка, в которой был поиск.
А найденная подстрока будет лежать в нулевом
элементе возвращенного массива (почему так
- поймете дальше).
Смотрите пример:
let str = 'zzz xaaax xaaaax xaaaaax';
let res = str.match(/xa+x/);
console.log(res[0]); // выведет 'xaaax' - найденное
console.log(res.index); // выведет 4 - позиция начала найденного
Карманы для метода match
Давайте теперь разберемся, почему найденное попадает в нулевой элемент массива с результатом. Дело в том, что в остальные элементы этого массива попадают карманы.
Карманы представляют собой способ разбить найденное на отдельные части. Для их использования нужно заключить часть регулярки в круглые скобки. В этом случае в массиве с результатом кроме найденной строки также появится и то, что попало под регулярку, стоящую в этих скобках.
В следующем примере мы ищем строки по шаблону
буквы 'x'
, а между ними - от одной
и более букв 'a'
. При этом найденные
буквы 'a'
попадут в карман:
let str = 'sss xaaax zzz';
let res = str.match(/x(a+)x/);
console.log(res[0]); // выведет 'xaaax' - найденное
console.log(res[1]); // выведет 'aaa' - карман
Можно использовать не один карман, а несколько. В этом случае первые скобки будут первым карманом, вторые - вторым и так далее. Смотрите пример:
let str = 'sss xaaa-bbbx zzz';
let res = str.match(/x(a+)-(b+)x/);
console.log(res[0]); // выведет 'xaaax' - найденное
console.log(res[1]); // выведет 'aaa' - 1 карман
console.log(res[2]); // выведет 'bbb' - 2 карман
Практические задачи
Дана строка, содержащая домен:
let str = 'sss domain.ru zzz';
Найдите этот домен и положите его имя в первый карман, а зону - во второй.
Дана строка, содержащая дату:
let str = '31.12.2025';
Положите день в первый карман, месяц - во второй, а год - в третий.