Unterstützung für mehrzeilige Regex in Vim


116

Ich stelle fest, dass die Standard-Regex-Syntax für den Abgleich über mehrere Zeilen hinweg die Verwendung von / s ist, wie folgt:

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

Dies funktioniert beispielsweise in Perl, scheint jedoch in Vim nicht unterstützt zu werden. Stattdessen muss ich viel genauer sein:

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

Ich kann keinen Grund finden, warum dies so sein sollte, also denke ich, dass ich wahrscheinlich nur die relevanten Stellen in der vim-Hilfe verpasst habe.

Kann jemand dieses Verhalten auf die eine oder andere Weise bestätigen?

Antworten:


176

Ja, Perls //sModifikator ist in Vim-Regexen nicht verfügbar. Sehen:h perl-patterns Informationen und eine Liste anderer Unterschiede zwischen Vim- und Perl-Regexen finden Sie hier.

Stattdessen können Sie verwenden \_., was bedeutet, "mit jedem einzelnen Zeichen einschließlich Zeilenumbruch übereinstimmen". Es ist etwas kürzer als das, was Sie haben. Siehe :h /\_..

/This\_.*text/

4
Schön - mein Leben ist jetzt ein bisschen einfacher. Ich hatte (. | \ N) *
ojrac

2
Was bedeutet der Schrägstrich :h /\_.? Ich meine, ich weiß, dass es funktioniert, aber warum funktioniert es :h /\_.und nicht :h \_.?
Eddified

2
@Eddified der Schrägstrich (der der Standardschlüssel für die Suche ist) gibt den Kontext an, \_.den Sie wie folgt lesen können: Geben Sie mir Hilfe für den Suchausdruck \_.
Florian

Es scheint jedoch, dass ich mit diesem Ausdruck keinen verzögerten Abgleich durchführen kann, selbst wenn ich ihn in Klammern gesetzt habe. Gibt es eine Möglichkeit, dies zu tun?
xji

2
@JIXiang Für ein faules Match foo bar \n foo baz \n fooversuchen Sie/foo\_.\{-}foo
James M. Lay
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.