Ancoraggi "Zoom"
Oltre alla risposta di @ jecxjo, ci sono molte situazioni in cui è possibile utilizzare gli ancoraggi di larghezza zero \zs
e \ze
invece di lookaround positivo. Queste ancore definiscono l'inizio ( \zs
) e la fine ( \ze
) della corrispondenza all'interno del modello completo.
Esempi
foo\zsbar
corrisponderà bar
preceduto da foo
( foo
non parte della partita)
foo\zebar
corrisponderà foo
seguito da bar
( bar
non parte della partita)
myFunction(\zs.*\ze)
corrisponderà ai parametri in una chiamata di funzione (a scopo dimostrativo, non mi sto concentrando sulla corrispondenza avida vs non avida)
Mettendolo in uso
Questi diventano più utili quando si utilizza il :substitute
comando. Ad esempio, supponiamo che volessi sostituire i parametri in una chiamata di funzione myFunction()
con foo
:
:%s/myFunction(\zs.*\ze)/foo/
Questo lascerà myFunction(
e sarà )
intatto e non dovrai preoccuparti di catturarli nel tuo schema o di ripeterli nella tua sostituzione .
Puoi farlo usando la funzionalità di lookgeund della regex di Vim, ma è piuttosto goffa:
:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/
(Trovo che questa sintassi mi faccia dimenticare in primo luogo quello che stavo cercando di fare.)
Hai ancora bisogno di lookaround a volte
Ci sono ancora situazioni in cui hai bisogno di cercare. Usare \zs
e \ze
è ottimo per situazioni semplici in cui hai qualcosa prima seguito da un testo da abbinare seguito da qualcosa dopo . Ma se è più complesso di quello, probabilmente dovrai attenersi alla sintassi di lookaround più pesante.
Fatto divertente
Sebbene siano considerevolmente più brutti, i lookaround di Vim sono più potenti di quelli in PCRE! Supportano un aspetto negativo a lunghezza variabile, il che significa che puoi affermare che un modello la cui lunghezza non è predeterminata non è precedente alla tua corrispondenza.
PCRE non lo supporta, poiché è abbastanza costoso dal punto di vista computazionale. Non è una grande preoccupazione in Vim, poiché i casi d'uso più comuni di regex tendono a coinvolgere la ricerca interattiva in cui il tempo di calcolo è quasi impercettibile per l'utente. Probabilmente lo noteresti se fosse usato per l'evidenziazione della sintassi, però.
Argomenti della Guida pertinenti
:help \zs
:help \ze
:help perl-patterns