Supporto per espressioni regolari multilinea in Vim


117

Ho notato che la sintassi regex standard per la corrispondenza su più righe è quella di usare / s, in questo modo:

This is\nsome text
/This.*text/s

Ad esempio, funziona in Perl ma non sembra essere supportato in Vim. Invece, devo essere molto più specifico:

/This[^\r\n]*[\r\n]*text/

Non riesco a trovare alcuna ragione per cui questo dovrebbe essere, quindi penso che probabilmente mi sono perso i pezzi rilevanti nell'aiuto di vim.

Qualcuno può confermare questo comportamento in un modo o nell'altro?

Risposte:


177

Sì, il //smodificatore di Perl non è disponibile nelle espressioni regolari di Vim. Vedere :h perl-patternsper i dettagli e un elenco di altre differenze tra le espressioni regolari di Vim e Perl.

Invece puoi usare \_., che significa "abbina ogni singolo carattere incluso il ritorno a capo". È un po 'più corto di quello che hai. Vedi :h /\_..

/This\_.*text/

4
Bello, la mia vita è appena diventata un po 'più facile. Stavo facendo (. | \ N) *
ojrac

2
Cosa taglia l'attaccante nel :h /\_.fare? Voglio dire, lo so che funziona, ma perché :h /\_.funziona e no :h \_.?
Eddified

2
@Eddified la barra (che è la chiave predefinita per la ricerca) specifica il contesto di \_.cui puoi leggere come: dammi aiuto per l'espressione di ricerca \_.
Florian

Tuttavia, sembra che non possa eseguire la corrispondenza pigra con questa espressione, anche se l'ho inclusa tra parentesi? C'è modo di farlo?
xji

2
@JIXiang Per una partita pigra foo bar \n foo baz \n foo, prova/foo\_.\{-}foo
James M. Lay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.