Obsługa wieloliniowych wyrażeń regularnych w Vimie


117

Zauważyłem, że standardowa składnia regex do dopasowywania w wielu wierszach polega na użyciu / s, na przykład:

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

Działa to na przykład w Perlu, ale nie wydaje się być obsługiwane w Vimie. Zamiast tego muszę być bardziej szczegółowy:

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

Nie mogę znaleźć żadnego powodu, dla którego tak powinno być, więc myślę, że prawdopodobnie przegapiłem odpowiednie fragmenty w pomocy vim.

Czy ktoś może potwierdzić to zachowanie w taki czy inny sposób?

Odpowiedzi:


177

Tak, //smodyfikator Perla nie jest dostępny w wyrażeniach regularnych Vima. Zobacz :h perl-patternspo szczegóły i listę innych różnic między wyrażeniami regularnymi Vima i Perla.

Zamiast tego możesz użyć \_., co oznacza „dopasuj dowolny pojedynczy znak, w tym znak nowej linii”. Jest trochę krótszy niż to, co masz. Zobacz :h /\_..

/This\_.*text/

4
Nieźle - moje życie stało się trochę łatwiejsze. Robiłem (. | \ N) *
ojrac

2
Co powoduje cięcie do przodu :h /\_.? To znaczy wiem, że to działa, ale dlaczego :h /\_.działa, a nie :h \_.?
Eddified

2
@Edified the forward slash (który jest domyślnym kluczem do wyszukiwania) określa kontekst, w \_.którym możesz przeczytać, na przykład: daj mi pomoc dotyczącą wyrażenia wyszukiwania \_.
Florian

Wydaje się jednak, że nie mogę wykonać leniwego dopasowywania z tym wyrażeniem, nawet jeśli umieściłem je w nawiasach? Czy jest na to sposób?
xji,

2
@JIXiang Na leniwy mecz foo bar \n foo baz \n foospróbuj/foo\_.\{-}foo
James M. Lay
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.