Методы класса String. Регулярные выражения

При изучении класса String нами были оставлены без внимания некоторые методы. Рассмотрим их подробно:

  • search(<Регулярное выражение>) — возвращает индекс позиции первого вхождения подстроки, совпадающей с регулярным выражением, или значение -1, если совпадений нет:
let p = /20[14]/;
let str = '200, 201, 202, 203, 204';
console.log( str.search(p) );   // 5
console.log( '200'.search(p) ); // -1

Шаблону 20[14] соответствуют только два числа: 201 и 204.

Можно также воспользоваться следующим синтаксисом:

let p = /20[14]/;
let str = '200, 201, 202, 203, 204';
console.log( p[Symbol.search](str) );   // 5
  • match(<Регулярное выражение>) — возвращает массив с результатами поиска, совпадающими с регулярным выражением, или значение null, если совпадений нет:
let p = /20[14]/;
let str = '200, 201, 202, 203, 204';
let arr = str.match(p);
console.log( arr );
// [
//    '201',
//    index: 5,
//    input: '200, 201, 202, 203, 204',
//    groups: undefined
// ]
console.log( '200'.match(p) ); // null

Обратите внимание: при отсутствии флага g результат дополнительно содержит свойства index (индекс найденного фрагмента) и input (оригинальная строка).

Предыдущий пример выведет только 201, т. к. не указан модификатор глобального поиска g. Модифицируем шаблон, чтобы получить все вхождения:

let p = /20[14]/g;
let str = '200, 201, 202, 203, 204';
let arr = str.match(p);
console.log(arr);            // [ '201', '204' ]

Теперь будут выведены все подстроки, совпадающие с регулярным выражением.

Можно также воспользоваться следующим синтаксисом:

let p = /20[14]/g;
let str = '200, 201, 202, 203, 204';
let arr = p[Symbol.match](str);
console.log(arr);            // [ '201', '204' ]
  • matchAll(<Регулярное выражение>) — возвращает итератор с результатами поиска, совпадающими с регулярным выражением. В отличие от метода match() дополнительно позволяет получить фрагменты (группы), заключенные в шаблоне в круглые скобки:
let p = /(20)([14])/g;
let str = '200, 201, 202, 203, 204';
let iterator = str.matchAll(p);
for (const match of iterator) {
   console.log(match);
}
/*
[
  '201',                    // Полное совпадение
  '20',                     // Фрагмент внутри первых скобок
  '1',                      // Фрагмент внутри вторых скобок
  index: 5,
  input: '200, 201, 202, 203, 204',
  groups: undefined
]
[
  '204',
  '20',
  '4',
  index: 20,
  input: '200, 201, 202, 203, 204',
  groups: undefined
]
*/
// Преобразование в массив
let arr = [...str.matchAll(/20[14]/g)];
console.log(arr);
/*
[
   [
     '201',
     index: 5,
     input: '200, 201, 202, 203, 204',
     groups: undefined
   ],
   [
     '204',
     index: 20,
     input: '200, 201, 202, 203, 204',
     groups: undefined
   ]
 ]
*/
// Преобразование в массив
let arr2 = Array.from(str.matchAll(/20[14]/g), a => a[0]);
console.log(arr2); // [ '201', '204' ]

Обратите внимание: итератор можно использовать только один раз. Чтобы создать новый итератор, следует вызвать метод matchAll() повторно.

Можно также воспользоваться следующим синтаксисом:

let p = /(20)([14])/g;
let str = '200, 201, 202, 203, 204';
let iterator = p[Symbol.matchAll](str);
let arr = Array.from(iterator, a => a[0]);
console.log(arr); // [ '201', '204' ]
  • replace(<Регулярное выражение>, <Текст для замены>) — возвращает строку, которая является результатом поиска и замены в исходной строке с использованием регулярного выражения:
let p = /20[14]/g;
let str = '200, 201, 202, 203, 204';
let str2 = str.replace(p, '207');
console.log(str2);         // 200, 207, 202, 203, 207

В качестве первого параметра можно указать строку, но в этом случае будет произведена замена только первого вхождения подстроки в исходную строку:

let str = '200, 201, 200, 200';
let str2 = str.replace('200', '207');
console.log(str2);         // 207, 201, 200, 200

В качестве второго параметра можно указать ссылку на функцию. Через первый параметр в функции доступна подстрока, полностью соответствующая шаблону. Через следующие параметры доступны подвыражения, которые соответствуют фрагментам, заключенным в шаблоне в круглые скобки. Через предпоследний параметр — смещение подстроки внутри строки, а через последний — исходная строка. Функция должна вернуть подстроку для замены.

В качестве примера найдем все числа в строке и прибавим к ним число 10:

let p = /([0-9]+)/g;
let str = '200, 201, 202, 203, 204';
let str2 = str.replace(p, function(s, x, offset, sourceStr) {
   console.log(x + '; ' + offset + '; ' + sourceStr);
   let n = parseInt(s, 10);
   n += 10;
   return n + '';
});
console.log(str2); // 210, 211, 212, 213, 214

В строке для замены можно использовать специальные переменные $1, ..., $N, через которые доступны фрагменты, заключенные в шаблоне в круглые скобки. Через переменную $& доступна вся подстрока, через переменную $` — фрагмент до подстроки, а через переменную $' — фрагмент после подстроки.

В качестве примера поменяем два тега местами:

let p = /<([a-z]+)><([a-z]+)>/g;
let str = '<br><hr>';
let str2 = str.replace(p, '<$2><$1>');
console.log(str2); // <hr><br>

Можно также воспользоваться следующим синтаксисом:

let p = /<([a-z]+)><([a-z]+)>/g;
let str = '<br><hr>';
let str2 = p[Symbol.replace](str, '<$2><$1>');
console.log(str2); // <hr><br>
  • replaceAll(<Регулярное выражение>, <Текст для замены>) — возвращает строку, которая является результатом поиска и замены всех фрагментов в исходной строке с использованием регулярного выражения. Обратите внимание: в Node.js версии 12 метод replaceAll() отсутствует. В последующих примерах показан результат работы в Web-браузере Firefox версии 81:
let p = /20[14]/g;
let str = '200, 201, 202, 203, 204';
let str2 = str.replaceAll(p, '207');
console.log(str2);         // 200, 207, 202, 203, 207

Если в регулярном выражении отсутствует флаг g, то будет сгенерировано исключение:

TypeError: replaceAll must be called with a global RegExp

В первом параметре можно указать обычную строку:

let str = '200, 201, 200, 200';
let str2 = str.replaceAll('200', '207');
console.log(str2);         // 207, 201, 207, 207

В качестве второго параметра можно указать ссылку на функцию. Через первый параметр в функции доступна подстрока, полностью соответствующая шаблону. Через следующие параметры доступны подвыражения, которые соответствуют фрагментам, заключенным в шаблоне в круглые скобки. Через предпоследний параметр — смещение подстроки внутри строки, а через последний — исходная строка. Функция должна вернуть подстроку для замены.

В качестве примера найдем все числа в строке и прибавим к ним число 10:

let p = /([0-9]+)/g;
let str = '200, 201, 202, 203, 204';
let str2 = str.replaceAll(p, 
   function(s, x, offset, sourceStr) {
      console.log(x + '; ' + offset + '; ' + sourceStr);
      let n = parseInt(s, 10);
      n += 10;
      return n + '';
   });
console.log(str2); // 210, 211, 212, 213, 214

В строке для замены можно использовать специальные переменные $1, ..., $N, через которые доступны фрагменты, заключенные в шаблоне в круглые скобки. Через переменную $& доступна вся подстрока, через переменную $` — фрагмент до подстроки, а через переменную $' — фрагмент после подстроки.

В качестве примера поменяем два тега местами:

let p = /<([a-z]+)><([a-z]+)>/g;
let str = '<br><hr>';
let str2 = str.replaceAll(p, '<$2><$1>');
console.log(str2); // <hr><br>

Метод split(<Регулярное выражение>[, <Лимит>]) также поддерживает регулярные выражения. Он возвращает массив, полученный в результате разделения строки на подстроки по фрагменту, соответствующему регулярному выражению. Если второй параметр присутствует, то он задает максимальное количество элементов в результирующем массиве:

let p = /\s/g;
let str = '1 2 3\n4\t5\r6';
let arr = str.split(p);
console.log(arr);         // [ '1', '2', '3', '4', '5', '6' ]
arr = str.split(p, 3);
console.log(arr);         // [ '1', '2', '3' ]

Можно также воспользоваться следующим синтаксисом:

let p = /\s/g;
let str = '1 2 3\n4\t5\r6';
let arr = p[Symbol.split](str);
console.log(arr);         // [ '1', '2', '3', '4', '5', '6' ]
arr = p[Symbol.split](str, 3);
console.log(arr);         // [ '1', '2', '3' ]

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов