繁体   English   中英

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

[英]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

我必须定期删除各个字段中的所有内容,并手动提供将占用该空间的新数据。 问题是日志太长到 select 并手动删除所有这些内容,所以我在Notepad++查找/替换中编写了一个 RegEx 来检测分隔符*的结尾和后续行\r\n直到它颠簸进入另一个*

以下是我的表达:

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

怎么运行的:

  • 第一组:从一组星号/星号分隔符中捕获最后一个*
  • 第二组:捕获分隔符内不是星号或文本的所有内容,并以换行符结尾(至少我相信这是正确的解释);
  • 第三组:捕获左分隔符*的开头。

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

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

非常感谢您的帮助。

更新:任何内容字段都不能包含*星号/星号,而且*星号/星号的数量可能因字段而异。 它们仅用于分隔日志文件中的不同信息。

我的意图是使用此规则并在查找/替换中将匹配的内容替换为\n\n 它会产生这样的东西:

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

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

...

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

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

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

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

模式匹配:

  • ^字符串开始
  • \*.*\R匹配*后跟该行的 rest 和一个换行符
  • \K忘记到目前为止匹配的内容
  • .*匹配整行
  • (?:\R(?.\*).*)*可选地重复匹配所有不以星号开头的行
  • \R匹配换行符
  • (?=\*)正向前瞻,向右断言*

正则表达式演示

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

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

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

这将找到内容为** field 1 **的第一行到第一组(包括一个\n - 请在必要时添加一个\r ,以便每个\n变成一个\r\n ),然后匹配所有内容包括换行符(这里再次仅使用\n )直到下一个字段 header 紧随其后(但下一个字段 header 不是匹配项的一部分)。

所以你可以用组 1 替换这个表达式,如果你重复这个,应该只留下字段标题。 (提示:在 NotePad++ 中,您可以将\1设置为替换来实现此目的。)

由于最后一个字段后面没有另一个字段 header,因此它也永远不会匹配。

请注意,正则表达式预计每个字段 header 行的开头和结尾至少有两个*

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM