Необходимо подобрать регулярное выражение
Доброго времени суток, не разу не сталкивался с регулярными выражениями. Сейчас необходимо вытащить подстроку с помощью регулярного выражения.
Строка:
Привет мир, как дела? Сегодня прекрасно. [data]Подстрока с информацией[/data]
Буду рад развернутому ответу. Заранее спасибо.
Ответы (3 шт):
Один из вариантов:
- Найти с помощью indexOf позицию вхождения двух тегов
- С помощью 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));
Можно так например, если несколько таких штук:
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);
const regex = /(?<=\[(data\])).*?(?=\[\/\1)/gm;
const str = `Привет мир, как дела? Сегодня прекрасно. [data]Подстрока с информацией[/data]
Прощай мир, Сегодня ужасно. [data]Тоже с информацией[/data] тра та та`;
console.log(str.match(regex));
(?<=\[(data\])).*?(?=\[\/\1)
(?<=...) - группа позитивного просмотра назад, в захват не идет
\[- символ квадратной скобки(...)- обычная группа захвата (не полицейская =)), номер 1-
data\]- статичный текст значениеdata]
.*? - 0 и более любых символов, где ? - это отключение жадности квантификатора
(?=...) - позитивный просмотр вперед, в захват не идет
\[\/\1- подстановка символов[/и текста захваченного в группу номер 1