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 \m
BRE und \v
ERE, außer dass POSIX keine Lookarounds enthält.
Wenn eine solche Korrespondenz existiert, ist sie irgendwo definiert? pattern.txt
hat nur eine Erwähnung von POSIX
.
Oder müssen wir uns an "Magie" halten, um reguläre Vim-Ausdrücke zu beschreiben?
regular-expression
muru
quelle
quelle
\v
beinhaltet<>
Wortgrenzen, die AFAIK nur bei Vim gibt. Also nein, beschreiben Sie sie einfach als "Vim Regex". (Nicht als AntwortAntworten:
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\v
in Ihrem Muster macht es ein bisschen konsistenter.:help 'magic'
gibt eine gute Zusammenfassung: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-Musterqu\@!
) mit einem übereinq
, auf das kein folgtu
. (Dies ist richtiger alsq[^u]
, was erfordert , dass es einige Zeichen nach demq
.)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 derfoo
nicht genau 3 Kleinbuchstaben stehen") in Ordnung ist, aber nicht(?<![a-z]+)foo
("die Zeichenfolgefoo
, 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
\zs
und\ze
Anker. Hier können Sie den Beginn und das Ende des Spiels festlegen. Zum Beispielfoo(\zs.*\ze)
stimmt nur überein, was zwischen(
und)
in einem Funktionsaufruf stehtfoo(...)
. 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
, oderfood
das Musterf\%[ood]
verwendet werden. In PCRE würde ein solches Muster so aussehenf(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.
\%23c
Entspricht Spalte 23\%<23c
Spiele vor Spalte 23\%>23c
Spiele nach Spalte 23\%16l
stimmt mit Zeile 16 überein\%#
stimmt mit der Cursorposition übereinIch 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.
quelle