javascript - 正则表达式在多行文本中下一个匹配的开头处停止

标签 javascript regex multiline

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

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

看起来很简单

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

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

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

最佳答案

[\s\S] 还匹配换行符,因此 [\s\S]+ 将匹配到末尾。您可以在组 1 中捕获匹配的 ID_ 后跟 1 个以上字符。

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

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

关于javascript - 正则表达式在多行文本中下一个匹配的开头处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55971325/

相关文章:

php - JSON 编码问题

regex - 如何删除R中字符串中的正则表达式?

java - 接受任何字母、任何语言、符号或数字的任何编译的正则表达式

javascript - 球弹跳问题

javascript - 将 Base64 字符串保存为 .PNG 不起作用

javascript - 获取 2 个静态值中的 "the other"的最简单方法是什么?

regex - 用单个 Regex.Replace() 替换多个字符串 Replace()

split - 为什么我无法在 VB6 TextBox 中拆分从 Android 接收的文本行

c# - 如何使用正则表达式强制执行单行?

javascript - 替换两个字符串之间的多行文本