Необходимо подобрать регулярное выражение

Доброго времени суток, не разу не сталкивался с регулярными выражениями. Сейчас необходимо вытащить подстроку с помощью регулярного выражения.

Строка: Привет мир, как дела? Сегодня прекрасно. [data]Подстрока с информацией[/data]

Буду рад развернутому ответу. Заранее спасибо.


Ответы (3 шт):

Автор решения: Алексей Шиманский

Один из вариантов:

  1. Найти с помощью indexOf позицию вхождения двух тегов
  2. С помощью substring взять подстроку от начала первого тега + 6 сиволов (т.к. в [data] их столько) до начала второго тега

Ещё вариант без регулярки в один проход цикла. На счёт скорости конкатенации не могу подсказать.

let str = 'Привет мир, как дела? Сегодня прекрасно. [data]Подстрока с информацией[/data]';

let getSubstrbetweenTags = (str) => {
  let result = '';
  let closeBracketFound = false;
  
  for (let char of str) {
      if (closeBracketFound && char === '[')
          closeBracketFound = false;

      if (closeBracketFound)
          result += char;

      if (char === ']')
          closeBracketFound = true;    
  }
  
  return result;
}



console.log(getSubstrbetweenTags(str));

→ Ссылка
Автор решения: EzioMercer

Можно так например, если несколько таких штук:

const regexp = /\[data\](.*?)\[\/data\]/gi;

const string = 'Привет мир, как дела? Сегодня прекрасно. [data]Подстрока asdasd с информацией[/data] Привет мир, как дела? Сегодня прекрасно. [data]Подстрока sdс нужнёй информацией[/data]';

const datas = Array.from(string.matchAll(regexp), x => x[1]);

console.log(datas);

Если же всего 1 раз такое встречается, то можно так:

const regexp = /\[data\](.*)\[\/data\]/gi;

const string = 'Привет мир, как дела? Сегодня прекрасно. [data]Подстрока asdasd с информацией[/data] Привет мир, как дела? Сегодня прекрасно';

const data = [...string.matchAll(regexp)][0][1];

console.log(data);

А ещё можно с помощью split так:

const string = 'Привет мир, как дела? Сегодня прекрасно. [data]Подстрока asdasd с информацией 1[/data][data]Подстрока asdasd с информацией 2[/data] Привет мир, как дела? Сегодня прекрасно [data]Подстрока asdasd с информацией 3[/data]';

const data = string.split(/\[\/?data\]/).filter((x, i) => i % 2);

console.log(data);

→ Ссылка
Автор решения: ipatev_nn

const regex = /(?<=\[(data\])).*?(?=\[\/\1)/gm;
const str = `Привет мир, как дела? Сегодня прекрасно. [data]Подстрока с информацией[/data]
Прощай мир, Сегодня ужасно. [data]Тоже с информацией[/data] тра та та`;
console.log(str.match(regex));

(?<=\[(data\])).*?(?=\[\/\1)

(?<=...) - группа позитивного просмотра назад, в захват не идет

  • \[ - символ квадратной скобки
  • (...) - обычная группа захвата (не полицейская =)), номер 1
    • data\] - статичный текст значение data]

.*? - 0 и более любых символов, где ? - это отключение жадности квантификатора
(?=...) - позитивный просмотр вперед, в захват не идет

  • \[\/\1 - подстановка символов [/ и текста захваченного в группу номер 1
→ Ссылка