多行正则表达式模式的匹配逆

时间:2019-06-18 17:12:16

标签: regex notepad++ regex-lookarounds regex-negation

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

正则表达式:

^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

1 个答案:

答案 0 :(得分:2)

结果证明,我想我已经回答了我自己的问题-感谢@ 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