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



我使用了一些日志,其中每个信息字段都有几个分隔符,例如:

********** 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

我必须定期删除各个字段中的所有内容,并手动提供将占用该空间的新数据。问题是,日志太长,无法手动选择和删除所有内容,所以我在Notepad++中编写了一个RegEx find/replaces,以检测分隔符*的末尾以及带有rn的后续行,直到它碰到另一个*

下面是我的表达:

(?<=*)([^*]+rn)(?=*)

工作原理:

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

正如您在日志示例中所读到的,无论发生什么,最后一个字段都必须保持不变。所以我很难在最后一场比赛之后找到确切的位置。我尝试将最后一个字段内容中的一些唯一引用放入组2中否定的*匹配列表中,但没有成功。

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

事先非常感谢你的帮助。

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

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

********** Field #1 **********
********** Field #2 **********
...
********** The last field will always remain unchanged **********
Unchanged content from last field

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

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

^*.*RK.*(?:R(?!*).*)*R(?=*)

模式匹配:

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

Regex演示

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

我会尝试使用以下正则表达式:

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

这将在第一组中找到内容为** field 1 **的第一行(包括n-如有必要,请添加r,因此每个n都变为rn(,然后匹配包括换行符在内的所有内容(此处仅使用n(,直到下一个字段标头在后(但下一字段标头不是匹配的一部分(。

因此,您可以将此表达式替换为组1,如果重复此操作,则应只保留字段标头。(提示:在NotePad++中,您可以将1设置为替代品来实现这一点。(

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

请注意,正则表达式要求在每个字段标题行的开头和结尾至少有两个*

NotePad++的另一个提示是:请取消选中";。匹配换行符";选项以获得您想要的结果。

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

最新更新