удалить строку после совпадения, когда заканчивается определенная буква. регулярное выражение

regex

#регулярное выражение

Вопрос:

У меня проблема с регулярным выражением, я должен удалять строку NOP только тогда, когда предыдущая строка начинается с #/ и заканчивается буквой E

 SFIFIPII2#/TEST/APPTEST1/KJOBA01
 FOLLOWS KTEST1

SFIFIPII2#/TEST3/APPTEST12/KJOBA03E
 NOP
 FOLLOWS KTEST14D
 
SFIFIPII4#/TEST5/APPTEST3/KJOBA04
 NOP
 FOLLOWS KTEST15

SFIFIPII23#/TEST2/APPTEST13/KJOBA018
 FOLLOWS KTEST15

SFIFIPII26#/TEST7/APPTEST18/KJOBA01AE
 AT 0600 
 NOP
 FOLLOWS KTEST1B
 
SFIFIPII23#/TEST2/APPTEST11/KJOBA01C
 AT 0600 
 NOP
 FOLLOWS KTEST1S

SFIFIPII2A#/TESTD/APPTEST1F/KJOBA01D
 FOLLOWS KTEST1S

SFIFIPII2N#/TEST/APPTEST1V/KJOBTESTE
 AT 0600 
 NOP
 FOLLOWS KTEST11
 FOLLOWS KTEST12
 FOLLOWS KTEST11

SFIFIPII2#/TEST/APPTEST1/KJOBA01LS
NEEDS 1 MANAGER_XA#RA0E2AB
 FOLLOWS KTEST12

SFIFIPII2#/TEST3/APPTEST12/KJOBA08E
 NOP
 FOLLOWS KTEST14D
 

с помощью этого регулярного выражения я смог найти строку, начинающуюся с #/ и заканчивающуюся буквой E

^.*#/.*E$

в этом примере результат:

 SFIFIPII2#/TEST3/APPTEST12/KJOBA03E

SFIFIPII26#/TEST7/APPTEST18/KJOBA01AE

SFIFIPII2N#/TEST/APPTEST1V/KJOBTESTE

SFIFIPII2#/TEST3/APPTEST12/KJOBA08E
 

однако я не знаю, как удалить соответствующую строку NOP:

есть два случая, один с NOP-строкой сразу после него, второй случай заключается в том, что NOP-строка найдена через две строки.

 SFIFIPII2#/TEST3/APPTEST12/KJOBA03E
 NOP
 FOLLOWS KTEST14D

SFIFIPII26#/TEST7/APPTEST18/KJOBA01AE
 AT 0600 
 NOP
 FOLLOWS KTEST1B
 

https://regex101.com/r/FhdPKf/1

я использую текстовый редактор с поддержкой поиска и замены регулярных выражений. (текстовая панель, панель редактирования, pspad)

несколько советов, спасибо.

С уважением

Итало

Ответ №1:

Вы можете использовать группу захвата, чтобы сохранить то, что вы хотите после замены, и сопоставить строку с NOP для удаления.

При замене используйте группу захвата 1.

 ^(.*#/.*E(?:r?n(?![^Srn]*NOP$).*)*)r?n[^Srn]*NOP$
 
  • ^ Начало строки
  • ( Группа захвата 1
    • .*#/.*E Сопоставьте строку, которая содержит #/ и заканчивается на E
    • (?: Не группа захвата
      • r?n(?![^Srn]*NOP$).* Сопоставьте новую строку и остальную часть строки, если она не начинается с необязательных пробелов и NOP
    • )* Закройте группу и, при необходимости, повторите, чтобы соответствовать всем строкам
  • ) Закрыть группу 1
  • r?n[^Srn]*NOP Сопоставление новой строки, необязательных символов пробела без перевода строк и NOP
  • $ Конец строки

Смотрите демонстрацию регулярных выражений

Вы могли бы, например, также сделать шаблон немного более ограниченным, чтобы не пересекать совпадающие пустые строки или строки, которые также содержат /# и заканчиваются E символом между ними перед сопоставлением NOP :

 ^(.*#/.*E(?:r?n(?![^Srn]*(?:NOP)?$|.*#/.*E$).*)*)r?n[^Srn]*NOP$
 

Смотрите другую демонстрацию регулярных выражений

Комментарии:

1. большое спасибо за ваш код регулярных выражений.