Ответы:
я хотел бы использовать \zs
:%s/.*\zspattern/replacement/
Немного объяснения:
.
представляет любой отдельный символ*
представляет жадное сопоставление (как можно больше)В Vim вы можете использовать якоря нулевой ширины \zs
и \ze
определять начало и конец искомого шаблона, которому вы хотите соответствовать. Ничто до \zs
и после \ze
в вашем шаблоне не будет затронуто заменой.
Для того, чтобы сделать его легко понять, я хотел бы использовать этот пример из викия «s Поиск и замена :
Сохраните ввод с помощью
\zs
и,\ze
чтобы установить начало и конец шаблона. Например, вместо::s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/
Использование:
:s/Copyright \zs2007\ze All Rights Reserved/2008/
Для получения дополнительной информации посмотрите на
Вы можете искать последнее совпадение, группируя все \(.*\)
, но последнее вхождение pattern
. Затем выход с захваченной группой \1
и добавление replacement
.
:%s/\(.*\)pattern/\1replacement/
\zs
, в том смысле , что ваш \1
подход функционально эквивалентен, но более многословен. (С другой стороны, некоторые из них могут быть легче запомнить, особенно если они используются в других вариантах регулярных выражений.))
Ради полноты я думал, что выложу альтернативу. В Vim есть несколько элементов, некоторые из которых аналогичны более стандартным регулярным выражениям с обходными утверждениями (отрицательный / положительный взгляд / взгляд назад). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups
В этом случае нам нужен негативный взгляд, то \@!
есть мы хотим утверждать, что атом , предшествующий элементу, не встречается после паттерна . В этом случае атом является шаблоном, которому предшествует что-либо еще:
:%s/pattern\(.*pattern\)\@!/replacement/
Часть внутри круглых скобок имеет нулевую ширину и не включена в совпадение, поэтому не заменяется заменой.
:h \@!
для получения дополнительной информации или :h pattern-multi-items
для всего раздела, содержащего другие варианты поиска.
\zs
говорится в вашем ответе?