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
)*
Закройте группу и, при необходимости, повторите, чтобы соответствовать всем строкам
)
Закрыть группу 1r?n[^Srn]*NOP
Сопоставление новой строки, необязательных символов пробела без перевода строк иNOP
$
Конец строки
Смотрите демонстрацию регулярных выражений
Вы могли бы, например, также сделать шаблон немного более ограниченным, чтобы не пересекать совпадающие пустые строки или строки, которые также содержат /#
и заканчиваются E
символом между ними перед сопоставлением NOP
:
^(.*#/.*E(?:r?n(?![^Srn]*(?:NOP)?$|.*#/.*E$).*)*)r?n[^Srn]*NOP$
Смотрите другую демонстрацию регулярных выражений
Комментарии:
1. большое спасибо за ваш код регулярных выражений.