REGEX在下一场比赛开始时停止多行文本



id_first

每个ID后一次或多个
文字多样的行

id_second

模式重复多次

id_third

那是结局,但可能更大

我只想提取每个ID_*及其文本,直到下一个ID_。

看起来很容易

(ID_.+)([sS]+)

我尝试了几种贪婪和标志的组合,但它要么捕获所有文本直到结束,要么在id_下停止。我想我错过了一些基本

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

[sS]也匹配新线,因此[sS]+将匹配到结束。您可以在第1组中捕获匹配ID_,然后是1个以上的字符。

然后使用与newline匹配的重复模式在第2组中捕获,然后使用负LookAhead (?!,该模式首先检查该行是否以ID _:

开始。
(ID_.+)((?:n(?!ID_).*)*)

说明

  • (ID_.+)捕获组1-匹配ID_,然后匹配任何1次以上的char,除了新线
  • (捕获第2组
    • (?:非捕获组
      • n(?!ID_).*匹配newline,并断言直接在右边的内容不是ID_。如果是这种情况,请匹配0次以上任何char以外的任何char
    • )*关闭非捕获组,然后重复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]);
}

最新更新