如何排除正则表达式中分隔符之间的多行?
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)(?=\*)
工作原理:
- 第一组:从一组stars/asterisks个分隔符中捕获最后一个
*
;
- 第二组:捕获分隔符内不是星号或文本的所有内容,并以换行符结尾(至少我认为这是正确的解释);
- 第三组:捕获左分隔符的开头
*
。
正如您在日志示例中所读到的,无论如何,最后一个字段必须保持不变。所以我正在努力匹配最后一个字段之后的确切位置。我尝试在第 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”选项以获得您想要的结果。
试试
您可以匹配以星号开头和结尾的行,然后忘记到目前为止匹配的内容。
匹配所有不以星号开头的要删除的行
^\*.*\R\K.*(?:\R(?!\*).*)*\R(?=\*)
模式匹配:
^
字符串开头
\*.*\R
匹配 *
后跟该行的其余部分和换行符
\K
忘记目前匹配的是什么
.*
匹配整行
(?:\R(?!\*).*)*
可选择重复匹配所有不以星号开头的行
\R
匹配一个换行符
(?=\*)
正面前瞻,向右断言 *
然后替换为您的内容,然后换行。
我正在处理一些日志,其中每个信息字段都有多个分隔符,例如:
********** 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)(?=\*)
工作原理:
- 第一组:从一组stars/asterisks个分隔符中捕获最后一个
*
; - 第二组:捕获分隔符内不是星号或文本的所有内容,并以换行符结尾(至少我认为这是正确的解释);
- 第三组:捕获左分隔符的开头
*
。
正如您在日志示例中所读到的,无论如何,最后一个字段必须保持不变。所以我正在努力匹配最后一个字段之后的确切位置。我尝试在第 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”选项以获得您想要的结果。
试试您可以匹配以星号开头和结尾的行,然后忘记到目前为止匹配的内容。
匹配所有不以星号开头的要删除的行
^\*.*\R\K.*(?:\R(?!\*).*)*\R(?=\*)
模式匹配:
^
字符串开头\*.*\R
匹配*
后跟该行的其余部分和换行符\K
忘记目前匹配的是什么.*
匹配整行(?:\R(?!\*).*)*
可选择重复匹配所有不以星号开头的行\R
匹配一个换行符(?=\*)
正面前瞻,向右断言*
然后替换为您的内容,然后换行。