"Zoom" -Anker
Zusätzlich zu der Antwort von @ jecxjo gibt es viele Situationen, in denen Sie die Anker \zs
mit \ze
der Breite Null und anstelle einer positiven Suche verwenden können. Diese Anker definieren den Beginn ( \zs
) und das Ende ( \ze
) der Übereinstimmung innerhalb des vollständigen Musters.
Beispiele
foo\zsbar
wird Match bar
vorangestellt von foo
( foo
nicht Teil des Matchs)
foo\zebar
wird passen foo
gefolgt von bar
( bar
nicht Teil des Spiels)
myFunction(\zs.*\ze)
stimmen mit den Parametern in einem Funktionsaufruf überein (zu Demonstrationszwecken konzentriere ich mich nicht auf gierige oder nicht gierige Übereinstimmungen)
Putting it to use
Diese werden am nützlichsten, wenn Sie den :substitute
Befehl verwenden. Zum Beispiel, sagen , dass ich die Parameter in einem Funktionsaufruf ersetzen wollte myFunction()
mit foo
:
:%s/myFunction(\zs.*\ze)/foo/
Dies wird verlassen myFunction(
und )
intakt, und Sie müssen sich keine Sorgen machen über sie in Ihrem erfassen Muster oder sie in Ihrem Wiederholung Ersatz .
Sie könnten dies mit der Lookaround-Funktion von Vims Regex tun, aber es ist ziemlich klobig:
:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/
(Ich finde, dass diese Syntax dazu führt, dass ich vergesse, was ich überhaupt versucht habe.)
Manchmal brauchen Sie noch eine Suche
Es gibt immer noch Situationen, in denen Sie nachsehen müssen. Mit \zs
und \ze
sind ideal für einfache Situationen , in denen Sie etwas vor , gefolgt von Text übereinstimmen , gefolgt nach etwas . Aber wenn es komplexer ist, müssen Sie sich wahrscheinlich an die schwerere Lookaround-Syntax halten.
Lustige Tatsache
Obwohl sie erheblich hässlicher sind, sind Vims Lookarounds mächtiger als die in PCRE! Sie unterstützen ein negatives Aussehen mit variabler Länge, was bedeutet, dass Sie behaupten können, dass ein Muster, dessen Länge nicht vorbestimmt ist, nicht vor Ihrer Übereinstimmung liegt.
PCRE unterstützt dies nicht, da es ziemlich rechenintensiv ist. Dies ist in Vim kein großes Problem, da die häufigsten Anwendungsfälle von Regex in der Regel eine interaktive Suche umfassen, bei der die Rechenzeit für den Benutzer kaum wahrnehmbar ist. Sie würden es wahrscheinlich bemerken, wenn es für die Syntaxhervorhebung verwendet würde.
Relevante Hilfethemen
:help \zs
:help \ze
:help perl-patterns
Es sieht so aus, als ob dies möglich ist. Es gibt eine einfache Tabelle, um von Perl nach Vim zu gelangen.
:h perl-patterns
Wenn Sie zum Beispiel die Zeichenfolge haben
one two three
und sieone
nur dann<space>two
abgleichen möchten, wenn sie folgt, können Sie sie verwendenDies ähnelt der Perl-Version
quelle