Czy w systemie wyrażeń regularnych vima możliwe jest wyszukiwanie?

22

W vimie spotkałem się z wieloma sytuacjami, w których użyteczne byłyby wyrażenia opisujące. Próbowałem, używając standardowej składni lookaround ( (?=), (?!)etc ..) , ale wydaje się, vim nie obsługuje tej funkcji. Czy vim ma równoważną składnię dla tego rodzaju instrukcji?

Wiecznie zielone drzewo
źródło

Odpowiedzi:

29

Kotwy „Zoom”

Oprócz odpowiedzi @ jecxjo istnieje wiele sytuacji, w których można użyć kotwic o zerowej szerokości \zsi \zezamiast pozytywnego spojrzenia. Te kotwice definiują początek ( \zs) i koniec ( \ze) dopasowania w ramach pełnego wzorca.

Przykłady

  • foo\zsbardopasuje barpoprzedzone przez foo( foonie jest częścią meczu)
  • foo\zebardopasuje, fooa następnie bar( barnie będzie częścią meczu)
  • myFunction(\zs.*\ze)dopasuje parametry w wywołaniu funkcji (dla celów demonstracyjnych nie skupiam się na dopasowaniu chciwym a nie chciwym)

Oddanie go do użytku

Stają się one najbardziej przydatne podczas korzystania z :substitutepolecenia. Na przykład, powiedzmy chciałem zastąpić parametry w wywołaniu funkcji celu myFunction()z foo:

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

Pozostawi myFunction(i )nienaruszone, i nie trzeba się martwić o uchwycenie ich w swojej strukturze lub powtarzając je w wymianie .

Możesz to zrobić, korzystając z funkcji wyszukiwania wyrażenia regularnego Vima, ale jest to dość niezręczne:

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

(Uważam, że ta składnia powoduje, że zapominam, co chciałem zrobić w pierwszej kolejności.)

Nadal potrzebujesz czasem spojrzenia

Nadal istnieją sytuacje, w których trzeba się rozejrzeć. Używanie \zsi \zejest idealne do prostych sytuacji, w których masz coś przed, a po nim tekst do dopasowania, a po nim coś po . Ale jeśli jest to bardziej skomplikowane, prawdopodobnie będziesz musiał trzymać się cięższej składni.

Śmieszny fakt

Choć są znacznie brzydsze, spojrzenia Vima są potężniejsze niż w PCRE! Obsługują one negatywne spojrzenie za zmienną długością, co oznacza, że ​​możesz stwierdzić, że jakiś wzór, którego długość nie jest z góry określona, nie jest wcześniejszy niż dopasowanie.

PCRE nie obsługuje tego, ponieważ jest dość drogi obliczeniowo. To nie jest duży problem w Vimie, ponieważ najczęstsze przypadki użycia wyrażenia regularnego obejmują wyszukiwanie interaktywne, w którym czas obliczeń jest prawie niezauważalny dla użytkownika. Prawdopodobnie zauważyłbyś to, gdyby był użyty do podświetlania składni.

Odpowiednie tematy pomocy

  • :help \zs
  • :help \ze
  • :help perl-patterns
tommcdo
źródło
Nie wiedziałem o kotwach zoomu. Dzięki za ich wyjaśnienie.
EvergreenTree
14

Wygląda na to, że jest to możliwe. Istnieje prosta tabela do przejścia z Perla na Vima.: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)

Na przykład, jeśli masz ciąg znaków one two threei chcesz dopasować onetylko, jeśli <space>twopodąża za nim, możesz użyć

/one\(\stwo\)\@=

Jest to podobne do wersji Perla

m/one(?=\stwo)/
jecxjo
źródło