Vim'in regex sisteminde etrafa bakmak mümkün mü?


22

Vim'de lookaround ifadeleri kullanmanın faydalı olacağı birçok durumla karşılaştım. Standart lookaround sözdizimini ( (?=), (?!)etc ..) kullanmayı denedim , ancak vim bunu desteklemiyor gibi görünüyor. Vim'in bu tür ifadeler için eşdeğer bir sözdizimi var mı?

Yanıtlar:


29

"Zoom" çapaları

@ Jecxjo'nun cevabına ek olarak, sıfır genişlikte çapaları \zsve \zepozitif görünüm yerine kullanabileceğiniz birçok durum vardır . Bu çapalar , tam kalıbın içindeki eşleşmenin başlangıcını ( \zs) ve sonunu ( \ze) tanımlar .

Örnekler

  • foo\zsbarmaç olacak baröncesinde foo( foomaçın parçası değil)
  • foo\zebarmaç olacak fooizledi bar( barmaçın değil parçası)
  • myFunction(\zs.*\ze)işlev çağrısındaki parametrelerle eşleşir (gösterim amacıyla, açgözlü vs açgözlü olmayan eşleşmeye odaklanmıyorum)

Kullanmak için koyarak

Bunlar :substitutekomutu kullanırken en kullanışlı hale gelir . Örneğin, ben bir işlev çağrısında parametreleri değiştirmek istediğini söylüyor myFunction()ile foo:

:%s/myFunction(\zs.*\ze)/foo/

Bu bırakacaktır myFunction(ve )bozulmamış ve siz onları yakalamak konusunda endişe gerekmez desen veya bunları tekrar yerine .

Bunu Vim'in regex'in arama özelliğini kullanarak yapabilirsiniz, ancak oldukça tıknazdır:

:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/

(Bu sözdiziminin ilk başta ne yapmaya çalıştığımı unutmama neden olduğunu biliyorum.)

Hala bazen etrafa bakmak gerek

Etrafınıza bakmanız gereken durumlar var. Kullanılması \zsve \zesahip olduğunuz basit durumlar için mükemmeldir önce bir şeyi takip metne uyuşturmak için takip sonrasında bir şey . Fakat bundan daha karmaşıksa, muhtemelen daha geniş görünen sözdizimine bağlı kalmak zorunda kalacaksınız.

Eğlenceli gerçek

Çok çirkin olsalar da, Vim'in görünüşü PCRE'dekilerden daha güçlü! Onlar uzunluğu önceden belirlenmiş olmadığı çeşitli desen olduğunu iddia edebilir, yani değişken uzunluktaki Negatif Geriye İlerleme destekleyen değil sizin maç öncesi.

PCRE bunu desteklemiyor, çünkü oldukça pahalı bir işlem. Bu, Vim'de çok büyük bir endişe değildir, çünkü en sık kullanılan regex vakaları, hesaplama zamanının kullanıcıya neredeyse algılanamadığı yerlerde etkileşimli arama yapma eğilimindedir. Yine de, sözdizimi vurgulaması için kullanılmışsa, muhtemelen farkedeceksiniz.

İlgili Yardım Konuları

  • :help \zs
  • :help \ze
  • :help perl-patterns

Zum bağlantılarının farkında değildim. Onları açıkladığınız için teşekkürler.
EvergreenTree,

14

Bu mümkün gibi görünüyor. Perl'den vim'e giden basit bir masa var.:h perl-patterns

9. Compare with Perl patterns               *perl-patterns*

Vim's regexes are most similar to Perl's, in terms of what you can do.  The
difference between them is mostly just notation;  here's a summary of where
they differ:

Capability                  in Vimspeak   in Perlspeak
----------------------------------------------------------------
force case insensitivity    \c            (?i)
force case sensitivity      \C            (?-i)
backref-less grouping       \%(atom\)     (?:atom)
conservative quantifiers    \{-n,m}       *?, +?, ??, {}?
0-width match               atom\@=       (?=atom)
0-width non-match           atom\@!       (?!atom)
0-width preceding match     atom\@<=      (?<=atom)
0-width preceding non-match atom\@<!      (?<!atom)
match without retry         atom\@>       (?>atom)

Mesela dizginiz varsa one two threeve onesadece bunlarla eşleşirseniz eşleştirmek <space>twoistiyorsanız

/one\(\stwo\)\@=

Bu perl versiyonuna benzer

m/one(?=\stwo)/
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.