регулярное выражение в начале следующего совпадения в многострочном тексте - PullRequest
0 голосов
/ 03 мая 2019

ID_FIRST

После каждого идентификатора появляются одна или несколько
строк с разнородным текстом

ID_SECOND

Шаблон повторяется много раз

ID_THIRD

Это конец, но может быть больше

И я просто хочу извлечь каждый ID_ * и его текст ниже до следующего ID_.

Это выглядит просто

(ID_.+)([\s\S]+)

Я пробовал несколько комбинаций жадности и флагов, но он либо захватывает весь текст до конца, либо останавливается на ID_.Я предполагаю, что упускаю что-то элементарное

https://regex101.com/r/Ruy44M/1

1 Ответ

1 голос
/ 03 мая 2019

[\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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...