【问题标题】:Regex - Capture multiple multiline text blocks with only a starting pattern正则表达式 - 捕获仅具有起始模式的多个多行文本块
【发布时间】:2021-09-28 00:28:01
【问题描述】:

我有一个非常大的文本文件,其中包含多个这样的条目:

    -------------------------------------
    
       LOTS OF
        MULTILINE
       TEXT
    
    *************************************
              MORE
       MULTILINE
         TEXT
    
    *************************************
    
       EVEN-MORE-TEXT-SOMETIMES-WITH-DASHES
    
    *************************************

    -------------------------------------

       2ND LOT OF
        MULTILINE
       TEXT
    
    *************************************
      MORE
       MULTILINE
         TEXT FOR 2ND LOT
    
    *************************************
    
       EVEN-MORE-TEXT-FOR-2ND

    *************************************

请注意,这只是两个条目,我不关心星号,而是虚线后面的文本。

我想获得一个包含每个条目中所有文本的捕获组,以便我以后可以逐行分析它。

我可以用这样的表达式捕获第一个条目:

/-{37}\s*([\s\S]+)-{37}/gm

但我无法多次运行捕获组,因为我没有明确的组终止符(因为 *{37} 出现了多次)

这是一个正则表达式 101 示例:

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

如何在虚线之后但在下一条虚线或文件末尾之前捕获文本?

编辑: 所以为了让我的问题更清楚,我希望第一个条目的捕获组是。

   LOTS OF
    MULTILINE
   TEXT

*************************************
          MORE
   MULTILINE
     TEXT

*************************************

   EVEN-MORE-TEXT-SOMETIMES-WITH-DASHES

*************************************

我也碰巧在文本中有一些破折号,所以我编辑了这个例子。理想情况下,我想要一个仅包含条目内容的捕获组数组。

【问题讨论】:

    标签: regex regex-group


    【解决方案1】:

    你可以使用这个正则表达式:

    -{37}\R+((?:.+\R)+)
    

    RegEx Demo

    正则表达式详细信息;

    • -{37}: 匹配长度为 37 的连字符
    • \R+: 匹配 1+ 个换行符
    • (: 启动捕获组
      • (?:.+\R)+:匹配一行 1+ 字符后跟换行符。重复此组 1 次以上以匹配这些行中的多个
    • ): 结束捕获组

    【讨论】:

    • @Dennis:这对你有用吗?
    • 感谢您的回答@anubhava。我认为我的问题并不清楚,但我需要在下一个 -{37} 之前捕获所有内容。因此,在我的示例中,捕获组必须是星号之前的所有内容。我会编辑我的问题,但我很感激你的回答。
    【解决方案2】:

    这个正则表达式将匹配两个条目:

    /-{37}[^-]+/gm
    

    在 regex101 中尝试一下。

    【讨论】:

      【解决方案3】:

      如果您想在一个捕获组中捕获示例数据中的 2 个部分:

      ^-{37}\s*^((?:(?!--).*(?:\r?\n|$))+)
      

      部分模式匹配:

      • ^ 字符串开始
      • -{37} 匹配 37 次 - char
      • \s*^ 匹配可选的空白字符,并断言字符串的开头(由于锚点,请注意使用多行标志)
      • ( 捕获第 1 组
        • (?:非捕获组
          • (?!--) 否定前瞻,在字符串的开头断言不是--(或使其更具体,如(?!-{37}\r?\n)
          • .*(?:\r?\n|$)匹配整行后跟换行符或断言字符串的结尾
        • )+关闭非捕获组1+次
      • )关闭第一组

      Regex demo

      或者更短一点,但它会在匹配中包含前导空格字符:

      ^-{37}((?:\r?\n(?!--).*)*)
      

      Regex demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 2010-12-14
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2018-01-19
        • 1970-01-01
        相关资源
        最近更新 更多