* представляет жадное сопоставление (как можно больше)
В 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/
Для получения дополнительной информации посмотрите на
Можете ли вы дать базовое описание того, что \zsговорится в вашем ответе?
EvergreenTree
3
Стоит отметить, что причина , по которой это работает, в том, что .*он жадный .
Уайлдкарт
7
Вы можете искать последнее совпадение, группируя все \(.*\), но последнее вхождение pattern. Затем выход с захваченной группой \1и добавление replacement.
(Это хуже, чем решение @ ryuichiro \zs, в том смысле , что ваш \1подход функционально эквивалентен, но более многословен. (С другой стороны, некоторые из них могут быть легче запомнить, особенно если они используются в других вариантах регулярных выражений.))
Аарон Тома
0
Ради полноты я думал, что выложу альтернативу. В Vim есть несколько элементов, некоторые из которых аналогичны более стандартным регулярным выражениям с обходными утверждениями (отрицательный / положительный взгляд / взгляд назад). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups
В этом случае нам нужен негативный взгляд, то \@!есть мы хотим утверждать, что атом , предшествующий элементу, не встречается после паттерна . В этом случае атом является шаблоном, которому предшествует что-либо еще:
:%s/pattern\(.*pattern\)\@!/replacement/
Часть внутри круглых скобок имеет нулевую ширину и не включена в совпадение, поэтому не заменяется заменой.
:h \@!для получения дополнительной информации или :h pattern-multi-itemsдля всего раздела, содержащего другие варианты поиска.
\zs
говорится в вашем ответе?.*
он жадный .Вы можете искать последнее совпадение, группируя все
\(.*\)
, но последнее вхождениеpattern
. Затем выход с захваченной группой\1
и добавлениеreplacement
.источник
\zs
, в том смысле , что ваш\1
подход функционально эквивалентен, но более многословен. (С другой стороны, некоторые из них могут быть легче запомнить, особенно если они используются в других вариантах регулярных выражений.))Ради полноты я думал, что выложу альтернативу. В Vim есть несколько элементов, некоторые из которых аналогичны более стандартным регулярным выражениям с обходными утверждениями (отрицательный / положительный взгляд / взгляд назад). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups
В этом случае нам нужен негативный взгляд, то
\@!
есть мы хотим утверждать, что атом , предшествующий элементу, не встречается после паттерна . В этом случае атом является шаблоном, которому предшествует что-либо еще:Часть внутри круглых скобок имеет нулевую ширину и не включена в совпадение, поэтому не заменяется заменой.
:h \@!
для получения дополнительной информации или:h pattern-multi-items
для всего раздела, содержащего другие варианты поиска.источник