【问题标题】:Regex across double line break跨双换行符的正则表达式
【发布时间】:2018-09-26 13:46:51
【问题描述】:

我有以下文字,我需要从中删除部分内容:

[Firstname LastName 21/06/2018 - 17:27]
Lorem Ipsum

[Foo Bar 25/01/2017 - 12:10]
Lorem Ipsum - First line
Lorem ipsum Second line
Lorem ipsum third line


Some other random text

我需要提取这段文本的部分内容,我几乎可以使用以下正则表达式做到这一点:

\[(?<name>\w+? \w+?) (?<date>\d{2}\/\d{2}\/\d{4}) - (?<time>\d{2}:\d{2})\]\n*(?<note>.+)

一切正常,除了标记为&lt;note&gt; 的组,它只拾取注释的第一行。如果注释中有换行符,则不会拾取换行符之后的任何内容。

如何让它匹配注释部分中的所有文本,直到正则表达式找到双换行符?

【问题讨论】:

    标签: regex


    【解决方案1】:

    您可以查找[^[],或者下一个方括号之前的每个字符,后跟两个换行符,而不是查找.(默认情况下不包括换行符):

    \[(?<name>\w+? \w+?) (?<date>\d{2}\/\d{2}\/\d{4}) - (?<time>\d{2}:\d{2})\]\n*(?<note>[^[]+\n\n)
    

    https://regex101.com/r/12S3ZQ/3

    【讨论】:

      【解决方案2】:

      我已经修改了你原来的正则表达式来给你预期的输出。

      \[(?<name>\w+? \w+?) (?<date>\d{2}\/\d{2}\/\d{4}) - (?<time>\d{2}:\d{2})\]\n*(?<note>.+\n?\n?)+
      

      它应该匹配所有内容,直到双换行符,注意唯一的变化是在最后。

      而不是……

      (?&lt;note&gt;.+)

      现在是……

      (?&lt;note&gt;.+\n?\n?)+

      编辑:更改了正则表达式,使其包含由一个换行符分隔的行,但不是两个。

      【讨论】:

        【解决方案3】:

        你可以使用

        \[(?<name>\w+? \w+?) (?<date>\d{2}\/\d{2}\/\d{4}) - (?<time>\d{2}:\d{2})\]\s*(?<note>[\s\S]+?)(?=\n{2}|$)
        

        regex demo

        (?&lt;note&gt;[\s\S]+?)(?=\n{2}|$) 将匹配 1+ 个字符,尽可能少,直到前 2 个换行符或字符串结尾。

        如果您的正则表达式引擎支持\R 构造以匹配任何换行序列,您可以使用(?=\R{2}|$)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-22
          • 2012-10-15
          • 1970-01-01
          • 2021-05-27
          • 2022-10-13
          • 1970-01-01
          • 2011-06-29
          相关资源
          最近更新 更多