如何排除正则表达式中分隔符之间的多行?

How to exclude multiple lines between separators in regex?

我正在处理一些日志,其中每个信息字段都有多个分隔符,例如:

********** Field #1 **********
Content inside Field #1
More content

********** Field #2 **********
Content inside Field #2
More content

...

********** The last field will always remain unchanged **********
Unchanged content from last field

我必须定期删除各个字段中的所有内容,并手动提供将占用该 space 的新数据。问题是日志太长 select 并手动删除所有内容,所以我在 Notepad++ find/replace 中写了一个 RegEx 来检测分隔符的结尾 * 和后续行 \r\n 直到碰到另一个 *.

下面是我的表达:

(?<=\*)([^\*]+\r\n)(?=\*)

工作原理:

正如您在日志示例中所读到的,无论如何,最后一个字段必须保持不变。所以我正在努力匹配最后一个字段之后的确切位置。我尝试在第 2 组的否定 \* 匹配列表中放置最后一个字段内容的一些唯一引用,但没有成功。

目前,我编写的解决方案适用于所有字段,但我想在最后一个字段必须保持不变并且能够 Replace All 不更改最后一个字段的情况下进行。我们有什么办法可以使用现有的解决方案并加以改进吗?如果不是,是否有针对这种情况的另一种不同解决方案?

非常感谢您的帮助。

Update: no content field can contain * stars/asterisks, also, the number of * stars/asterisks can vary from field to field. They are being used only for the purpose of separating the different information inside the log file.

我的意图是利用这条规则,将find/replace中的匹配内容替换为\n\n。它会产生这样的东西:

********** Field #1 **********

********** Field #2 **********

...

********** The last field will always remain unchanged **********
Unchanged content from last field

我会用这个正则表达式试试:

(^\*+.*\*+$\n)(?:.*\n)+?(?=^\*+.*\*+$\n)

这会把内容为** field 1 **的第一行找出到第一组(包括一个\n - 如有必要请加一个\r,所以每\n变为 \r\n),然后匹配包括换行符在内的所有内容(同样这里仅使用 \n)直到下一个字段 header 紧随其后(但下一个字段 header 不是部分比赛的)。

因此,您可以将此表达式替换为第 1 组,如果您重复此操作,则应仅保留 headers 字段。 (提示:在 NotePad++ 中,您可以设置 </code> 作为替换来实现此目的。)</p> <p>由于最后一个字段后面没有另一个字段 header,它也永远不会匹配。</p> <p>请注意,正则表达式要求每个字段 header 行的开头和结尾至少有两个 <code>*

NotePad++ 的另一个提示:请取消选中“. matches newline”选项以获得您想要的结果。

https://regex101.com/r/5kc4m6/1

试试

您可以匹配以星号开头和结尾的行,然后忘记到目前为止匹配的内容。

匹配所有不以星号开头的要删除的行

^\*.*\R\K.*(?:\R(?!\*).*)*\R(?=\*)

模式匹配:

  • ^ 字符串开头
  • \*.*\R 匹配 * 后跟该行的其余部分和换行符
  • \K忘记目前匹配的是什么
  • .*匹配整行
  • (?:\R(?!\*).*)* 可选择重复匹配所有不以星号开头的行
  • \R 匹配一个换行符
  • (?=\*) 正面前瞻,向右断言 *

Regex demo

然后替换为您的内容,然后换行。