首页 > 解决方案 > 匹配多行正则表达式模式的逆

问题描述

我在记事本++中有以下正则表达式,它将找到以“BGADD”开头的行,如果适用,所有后续行都以“+”开头。此匹配有效,我可以使用替换(使用零长度字符串)从我的文档中删除这些文本块。

正则表达式:

^BGADD.*$(\R|\z)(^[+].*$(\R|\z))*

然而,我想做的是匹配并删除与此相反的任何文本块,这样我就只剩下与模式匹配的内容了。

我尝试了正/负环视的组合,但未能提出可行的方法 - 可能是因为环视必须是固定长度?提前感谢您的帮助。我尝试了无数次搜索,并尝试实现我在类似线程上读过的各种东西,但还没有实现。

我正在使用的数据:

BGADD       1000100010011000
+       30001002300010035000
+          91016   91017   9
+          91024   91025   9
BGSET   10001002100001071000
+           1011    1012    
+           1019    1020    
BGADD       1000100010011000
BGADD       1000100010011000
+       30001002300010035000
+       19001006290010013900
BGSET   20001001200001012000
+           1011    1012    
SOMETHINGELSE  3000100230000
BGADD       1000100010011000
+       30001002300010035000
+       19001006290010013900
BGSET   30001003300001033000
BGSET   50001001500001035000
BGADD       1000100010011000
+       30001002300010035000
+       19001006290010013900
DIFFERENTTHING   19001001190
+           1011    1012    
+           1019    1020    
BGSET   19001002190001071900
BGADD       1000100010011000

如果我用正则表达式上的空白字符串替换它会是什么样子:

BGSET   10001002100001071000
+           1011    1012    
+           1019    1020    
BGSET   20001001200001012000
+           1011    1012    
SOMETHINGELSE  3000100230000
BGSET   30001003300001033000
BGSET   50001001500001035000
DIFFERENTTHING   19001001190
+           1011    1012    
+           1019    1020    
BGSET   19001002190001071900

我的目标是(即相反):

BGADD       1000100010011000
+       30001002300010035000
+          91016   91017   9
+          91024   91025   9
BGADD       1000100010011000
BGADD       1000100010011000
+       30001002300010035000
+       19001006290010013900
BGADD       1000100010011000
+       30001002300010035000
+       19001006290010013900
BGADD       1000100010011000
+       30001002300010035000
+       19001006290010013900
BGADD       1000100010011000

标签: regexnotepad++regex-lookaroundsregex-negation

解决方案


结果我想我已经回答了我自己的问题——感谢@Mako212 的建议,它提供了我还没有想到的第一部分。我构建的正则表达式查找不以“BGADD”或“+”开头的行,然后使用与我的问题中的第一个正则表达式相同的基础进行匹配,直到找到“BGADD”的下一个实例

我认为的答案是:

^(?!BGADD|[+]).*$(\R|\z)(.*$(\R|\z))*?(?=BGADD)

>>>编辑以简化和捕获文档的最后一行:

^(?!BGADD|[+])(.*$(\R|\z))+?(?=BGADD|\z)

输出:

BGADD       1000100010011000
+       30001002300010035000
+          91016   91017   9
+          91024   91025   9
BGADD       1000100010011000
BGADD       1000100010011000
+       30001002300010035000
+       19001006290010013900       
BGADD       1000100010011000
+       30001002300010035000
+       19001006290010013900
BGADD       1000100010011000
+       30001002300010035000
+       19001006290010013900
BGADD       1000100010011000

推荐阅读