Sind die regulären Ausdrücke von Vim mit bekannten regulären Ausdrücken kompatibel?

15

Die Syntax für reguläre Ausdrücke vieler Unix-Tools besteht häufig aus den POSIX-kodierten regulären Ausdrücken (BRE bzw. ERE) und in einigen modernen Implementierungen aus Perl (PCRE ist eine Implementierung davon).

Gibt es eine Eins-zu-eins-Entsprechung zwischen Vims Magiestufen und solchen extern definierten, aber bekannten Klassen? Es sieht aus wie \mBRE und \vERE, außer dass POSIX keine Lookarounds enthält.

Wenn eine solche Korrespondenz existiert, ist sie irgendwo definiert? pattern.txthat nur eine Erwähnung von POSIX.

Oder müssen wir uns an "Magie" halten, um reguläre Vim-Ausdrücke zu beschreiben?

muru
quelle
3
Ziemlich sicher \vbeinhaltet <>Wortgrenzen, die AFAIK nur bei Vim gibt. Also nein, beschreiben Sie sie einfach als "Vim Regex". (Nicht als Antwort
posten,
@Doorknob, ich denke, Sie finden diese Diskussion über Antworten als Kommentare vielleicht interessant. Da Ihr Kommentar drei positive Stimmen hat und keine Kommentare darauf antworten, dass er falsch ist, ist er wahrscheinlich korrekt (ich bin mir nicht sicher), schlug jedoch Änderungen und Ergänzungen vor. al. sind unmöglich, seine Genauigkeit zu verbessern. Als gepostete Antwort könnte es für eine verbesserte Genauigkeit bearbeitet, upvoted, downvoted, beantwortet werden, etc.
Wildcard

Antworten:

21

Zusammenfassend nein. Vims Regex ist ein einzigartiges Aroma, und es gibt keine Optionen, um das Verhalten eines anderen Aromas zu verbessern.

Ich denke das ist eine gute Sache.

Magie

Die 'magic'Option ändert nichts an der von Vim verwendeten Regex-Variante. Es \kehrt einfach das Verhalten vieler entkoppelter Atome um.

Beispiel: Standardmäßig +handelt es sich um ein Literal +, wobei \+"eines oder mehrere der vorhergehenden Atome" bedeutet. Im Gegensatz dazu *bedeutet "null oder mehr des vorhergehenden Atoms", während \*ein Literal ist *. Viele Leute finden das ziemlich verwirrend. Die Verwendung \vin Ihrem Muster macht es ein bisschen konsistenter. :help 'magic'gibt eine gute Zusammenfassung:

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

Persönlich denke ich, dass das Standardverhalten für Codedateien gut ist, bei denen es nicht ungewöhnlich ist foo(, mit dem Literal nach Dingen wie zu suchen (.

Vim's eigener Regex Geschmack

Ich habe viele Leute gesehen, die Vim gewünscht haben, PCRE zu unterstützen. Persönlich wünsche ich mir, dass andere Tools Vims Regex-Geschmack unterstützen. Es verfügt über einige Funktionen, die in PCRE entweder unmöglich oder zu umständlich sind.

In PCRE nicht möglich

Lookaround ist eine häufige Funktion, bei der Sie vor oder nach dem Muster, das Sie abgleichen möchten, behaupten können, dass ein Muster nicht oder nicht übereinstimmt. Zum Beispiel stimmt das PCRE-Muster q(?!u)(oder Vim-Regex-Muster qu\@!) mit einem überein q, auf das kein folgt u. (Dies ist richtiger als q[^u], was erfordert , dass es einige Zeichen nach dem q.)

Negatives Aussehen mit variabler Länge

PCRE und viele andere Geschmacksrichtungen haben die Einschränkung, dass ein negatives Lookbehind-Muster eine feste Länge haben muss. Das bedeutet, dass ein Muster wie (?<![a-z]{3})foo"die Zeichenfolge, vor der foo nicht genau 3 Kleinbuchstaben stehen") in Ordnung ist, aber nicht (?<![a-z]+)foo("die Zeichenfolge foo, vor der keine Anzahl von Kleinbuchstaben steht").

Diese Einschränkung existiert in Vim nicht. In Vim ist ein Muster wie \([a-z]\+\)\@<!foo, obwohl es vielleicht ein bisschen hässlich anzusehen ist, durchaus gültig.

Einfacher in Vim Regex

Einige Dinge sind viel schöner in Vims Geschmack von Regex.

Beginn und Ende der Spielanker

Am bemerkenswertesten sind meiner Meinung nach die \zsund \zeAnker. Hier können Sie den Beginn und das Ende des Spiels festlegen. Zum Beispiel foo(\zs.*\ze)stimmt nur überein, was zwischen (und )in einem Funktionsaufruf steht foo(...). Dies kann in PCRE durchgeführt werden, erfordert jedoch die Verwendung von Lookaround, was etwas mühsam ist:(?<=foo\().*(?=\))

Präfixabstimmung

Eine andere coole Sache, die Vim tun kann, ist, mit einem beliebigen Präfix (einschließlich des leeren Präfix) einer bestimmten Zeichenfolge übereinzustimmen. Zum Beispiel paßt auf f, fo, foo, oder fooddas Muster f\%[ood]verwendet werden. In PCRE würde ein solches Muster so aussehen f(o(od?)?)?. (Stellen Sie sich das für eine längere Zeichenfolge vor!)

Übereinstimmende Cursor-, Zeilen- und Spaltenpositionen

Vims Regex hat einige Anker, um Positionen im Puffer abzugleichen.


Ich denke, es lohnt sich, Vims Geschmack von Regex zu akzeptieren. Es ist gut für die Verwendung in einem Texteditor geeignet, der hauptsächlich für die Programmierung verwendet wird, und es ist ziemlich leistungsfähig.

tommcdo
quelle