[\s\S]
также соответствует новой строке, поэтому [\s\S]+
будет соответствовать до конца.Вы можете захватить в группе 1 соответствие ID_
, за которым следуют 1+ символов.
Затем выполните захват в группе 2, используя повторяющийся шаблон, который соответствует символу новой строки, после чего следует использовать отрицательный прогноз (?!
, который сначала проверяет, что строка не начинается с идентификатора _:
(ID_.+)((?:\n(?!ID_).*)*)
Пояснение
(ID_.+)
Группа захвата 1 - совпадение ID_
, затем сопоставление с любым символом 1+ раз, кроме новой строки (
Группа захвата 2 (?:
Группа без захвата \n(?!ID_).*
Соответствовать символу новой строки и утверждать, что непосредственно справа не ID_.В этом случае сопоставьте 0+ раз любому символу, кроме новой строки
)*
Закройте группу без захвата и повторите это 0+ раз
)
Закрыть группу захвата
Regex demo
Например:
const regex = /(ID_.+)((?:\n(?!ID_).*)*)/gm;
const str = `ID_FIRST
After each id come one or more
lines with diverse text
ID_SECOND
The pattern repeats many times
ID_THIRD
That's the end but could be larger`;
let m;
while ((m = regex.exec(str)) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
console.log("ID: " + m[1]);
console.log("Text: " + m[2]);
}