Группы. Регулярные выражения

Если необходимо получить содержимое без тегов, то нужный фрагмент внутри шаблона следует разместить внутри круглых скобок:

let p = /<b>(.*?)<\/b>/gi;
let str = '<b>Text1</b>Text2<b>Text3</b>';
let arr;
while ( (arr = p.exec(str)) ) {
   console.log(arr);
}
/* [
   '<b>Text1</b>',
   'Text1',
   index: 0,
   input: '<b>Text1</b>Text2<b>Text3</b>',
   groups: undefined
 ]
 [
   '<b>Text3</b>',
   'Text3',
   index: 17,
   input: '<b>Text1</b>Text2<b>Text3</b>',
   groups: undefined
 ] */

Результат будет доступен через элемент массива с индексом, совпадающем с порядковым номером круглых скобок внутри шаблона (нумерация начинается с единицы). Элемент массива с индексом 0 будет содержать фрагмент, полностью совпадающий с шаблоном.

Круглые скобки часто используются для группировки фрагментов внутри шаблона. В этих случаях не требуется чтобы фрагмент запоминался и был доступен в результатах поиска. Пример:

let p = /[a-z]+((st)|(xt))/gi;
let str = 'test text';
let arr;
while ( (arr = p.exec(str)) ) {
   console.log(arr);
}
/* [
   'test',
   'st',
   'st',
   undefined,
   index: 0,
   input: 'test text',
   groups: undefined
 ]
 [
   'text',
   'xt',
   undefined,
   'xt',
   index: 5,
   input: 'test text',
   groups: undefined
 ] */

Три последних элемента в этом примере являются лишними. Чтобы избежать захвата фрагмента после открывающей круглой скобки следует разместить символы ?:.

let p = /[a-z]+(?:(?:st)|(?:xt))/gi;
let str = 'test text';
let arr;
while ( (arr = p.exec(str)) ) {
   console.log(arr);
}
/* 
[ 'test', index: 0, input: 'test text', groups: undefined ]
[ 'text', index: 5, input: 'test text', groups: undefined ]
*/

В качестве примера использования групп разберем E-mail (листинг 8.3) и URL-адрес (листинг 8.4) на составные части.

Листинг 8.3. Разбор E-mail на составные части

let p = /^([a-z0-9_.-]+)@((?:[a-z0-9-]+\.)+[a-z]{2,6})$/i;
let str = 'user@mail.ru';
let arr = p.exec(str);
if (arr) {
   console.log(arr);
   console.log('Имя ящика - ' + arr[1]);
   console.log('Имя сайта - ' + arr[2]);
   console.log('Полный E-mail - ' + arr[0]);
}
else {
   console.log('E-mail не соответствует шаблону');
}

В итоге получим следующий результат:

[
  'user@mail.ru',
  'user',
  'mail.ru',
  index: 0,
  input: 'user@mail.ru',
  groups: undefined
]
Имя ящика - user
Имя сайта - mail.ru
Полный E-mail - user@mail.ru

Листинг 8.4. Разбор URL-адреса на составные части

let s = '^(\\w+://)' +
        '((?:[a-z0-9-]+\\.)+[a-z]{2,6})' +
        '([a-z0-9/-]*/)*' +
        '([a-z0-9-]+\\.[a-z]+)$';
let p = new RegExp(s, 'i');
let str = 'http://www.mysite.ru/folder1/folder2/forder3/file.html';
let arr = p.exec(str);
if (arr) {
   console.log('Протокол - ' + arr[1]);
   console.log('Сайт - ' + arr[2]);
   console.log('Путь - ' + arr[3]);
   console.log('Имя файла - ' + arr[4]);
}
else {
   console.log('URL не соответствует шаблону');
}

В итоге получим следующий результат:

Протокол - http://
Сайт - www.mysite.ru
Путь - /folder1/folder2/forder3/
Имя файла - file.html

Для получения фрагментов можно также воспользоваться статическими свойствами $1 … $N, а для получения полного соответствия свойством lastMatch. Эти свойства не входят в стандарт, но доступны во всех Web-браузерах и в Node.js:

console.log('Полный URL - ' + RegExp.lastMatch);
console.log('Протокол - ' + RegExp.$1);
console.log('Сайт - ' + RegExp.$2);
console.log('Путь - ' + RegExp.$3);
console.log('Имя файла - ' + RegExp.$4);

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

Помощь сайту

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

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