【问题标题】:regex stop at the beginning of next match in multiline text正则表达式在多行文本中的下一个匹配开始处停止
【发布时间】:2019-09-22 02:09:25
【问题描述】:

ID_FIRST

在每个 id 之后出现一个或多个
文字多样的线条

ID_SECOND

模式重复多次

ID_THIRD

到此结束,但可能会更大

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

看起来很简单

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

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

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

【问题讨论】:

    标签: javascript regex multiline


    【解决方案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]);
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-30
      • 2021-12-22
      • 1970-01-01
      • 2022-11-25
      • 2022-12-03
      相关资源
      最近更新 更多