2

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

Исходная строка:

lorem ipsum dolor sit amet consectetur
nunc KEEP THIS LINE ut massa lorem
DO NOT KEEP THIS LINE aenean blandit
nunc KEEP THIS LINE et justo quis
praesent at velit felis vel

Желаемая финальная строка:

KEEP THIS LINE ut massa lorem
KEEP THIS LINE et justo quis

До сих пор у меня есть регулярное выражение:

(?ms).*?(?-s)^nunc (KEEP THIS LINE.*?$)

Я могу просто заменить совпадение на обратную ссылку \1 . Тем не менее, это не может заменить от конца последнего сопоставленного шаблона до конца строки.

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

(?ms).*?(?-s)(^nunc (KEEP THIS LINE.*?$)|(?s:).*?\Z)

успешно идентифицирует шаблон между последней требуемой строкой и концом строки, но я не могу понять, как ее удалить.

1 ответ1

0

Замена ^(?:nunc (KEEP THIS LINE.*)|.*\n)$ с \1 приведет к желаемому результату:

  • Из-за генератора переменного тока (|), выражение ^(?:nunc (KEEP THIS LINE.*)?|.*\n)$ принудительно сопоставит всю строку без ее захвата (?: обозначает группу без захвата).

  • Если строка начинается с nunc KEEP THIS LINE , \1 будет ссылаться на внутренние скобки, т. Е. На строку, начинающуюся с KEEP THIS LINE и заканчивающуюся в конце строки.

  • Если строка не начинается с nunc KEEP THIS LINE .*\n будет соответствовать всей строке, включая завершающий символ новой строки.

Приведенное выше регулярное выражение прекрасно работает с Perl.

В Notepad++ с разрывами строк в Windows вы можете использовать это вместо:

^(?:nunc (KEEP THIS LINE.*)|.*(\r\n)?)

Обратите внимание, что это удалит только последнюю строку, но не удалит ее

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .