Соответствие инверсии многострочного регулярного выражения - PullRequest
1 голос
/ 18 июня 2019

У меня есть следующее регулярное выражение в notepad ++, которое найдет строку, начинающуюся с «BGADD», и, если применимо, все последующие строки, начинающиеся с «+». Это совпадение работает, и я могу использовать replace (со строкой нулевой длины), чтобы удалить эти блоки текста из моего документа.

Regex:

^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 Ответ

2 голосов
/ 18 июня 2019

Оказывается, я думаю, что ответил на свой вопрос - благодаря предложению @ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...