首页 > 解决方案 > 正则表达式在多行文本中的下一个匹配开始处停止

问题描述

ID_FIRST

在每个 id 之后出现一行或多
行不同的文本

ID_SECOND

图案重复多次

ID_THIRD

这就是结束,但可能更大

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

看起来很容易

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

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

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

标签: javascriptregexmultiline

解决方案


[\s\S]也匹配换行符,因此将[\s\S]+匹配到最后。您可以在第 1 组匹配中捕获ID_后跟 1+ 个字符。

然后使用匹配换行符的重复模式在第 2 组中捕获,然后使用负前瞻(?!,首先检查该行是否以 ID_ 开头:

(ID_.+)((?:\n(?!ID_).*)*)

解释

  • (ID_.+)捕获组 1 - Match ID_,然后匹配除换行符以外的任何字符 1+ 次
  • (捕获组 2
    • (?:非捕获组
      • \n(?!ID_).*匹配换行符并断言右边的内容不是 ID_。如果是这种情况,匹配 0+ 次除换行符以外的任何字符
    • )*关闭非捕获组并重复 0+ 次
  • )关闭捕获组

正则表达式演示

例如:

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]);
}


推荐阅读