Yanıtlar:
Kullanmak istiyorum \zs
:%s/.*\zspattern/replacement/
Biraz açıklama:
.
herhangi bir tek karakteri temsil eder*
açgözlü eşleşmeyi temsil eder (mümkün olduğunca çok sayıda)Vim'de, sıfır genişlikli bağlantı noktalarını kullanabilir \zs
ve \ze
eşleştirmek istediğiniz aranan desenin başlangıcını ve sonunu tanımlayabilirsiniz. Deseninizdeki öncesi \zs
ve sonrası değiştirme işleminden \ze
etkilenmeyecektir.
Kolay anlaşılması hale getirmek için, ben bu örneği kullanmak istiyorum Wikia 'ın Arama ve değiştirme :
Bir desenin başlangıcını ve sonunu ayarlamak için
\zs
ve tuşlarını kullanarak yazmayı kaydedin\ze
. Örneğin::s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/
kullanın:
:s/Copyright \zs2007\ze All Rights Reserved/2008/
Daha fazla bilgi için,
\(.*\)
Öğesinin tümünü , ancak son tekrarını gruplandırarak son eşleşmeyi arayabilirsiniz pattern
. Sonra yakalanan grupla \1
çıkın ve replacement
.
:%s/\(.*\)pattern/\1replacement/
\zs
senin ki, çözümü \1
yaklaşımı daha ayrıntılı işlevsel olarak eşdeğer, ancak (Öte yandan, bunların diğer regex tatlar için kullanılır, özellikle bazıları için hatırlamak daha kolay olabilir)..)
Bütünlük uğruna bir alternatif yayınlayacağımı düşündüm. Vim, bazıları daha standart düzenli ifade bakış açısı iddialarına (negatif / pozitif ileri / geri bakış) benzeyen çoklu öğelere sahiptir . /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups
Bu durumda negatif bir ileriye bakmak istiyoruz \@!
, yani öğeden önce gelen atomun kalıptan sonra gerçekleşmediğini iddia etmek istiyoruz . Bu durumda atom, kendisinden önce gelen başka bir şey olan desenin kendisidir:
:%s/pattern\(.*pattern\)\@!/replacement/
Parantez içindeki parça sıfır genişliktedir ve eşleşmeye dahil edilmemiştir, bu nedenle oyuncu değişikliği ile değiştirilmez.
:h \@!
daha fazla bilgi için veya :h pattern-multi-items
diğer arama varyasyonlarını içeren bölümün tamamı için.
\zs
cevabınızda neler olduğuna dair temel bir açıklama verebilir misiniz?