Regex in Vi: Wie benutzt man Zeichenklassen in Gruppen? (zB [\ s \ w])

15

In Vim entspricht die Zeichenklasse einem \sbeliebigen Leerzeichen. Wenn ich diese Sonderzeichen in Gruppen verwende [\s\w], stimmt sie beispielsweise nicht mit einem einzelnen Leerzeichen oder Wortzeichen überein, sondern mit soder w.

Wie verwendet man Zeichenklassen in Gruppen?

John HK
quelle
8
Im Gegensatz zu einigen Implementierungen von Modulen für reguläre Ausdrücke scheint Vim diese Notation nicht zu unterstützen. [[:space:][:alnum:]_]kann verwendet werden, um die Sammlung von \sund zu approximieren \w.
Peter Lewerin
@PeterLewerin Bitte poste das als Antwort.
Christopher Bottoms
@ChristopherBottoms: fertig.
Peter Lewerin

Antworten:

11

Dies ist keine Gruppe, sondern ein Bereich, und in Vim können keine Zeichenklassen verwendet werden (obwohl dies in anderen Regex-Implementierungen, z . B. in Python, möglich ist ). Sie müssen stattdessen eine Alternative verwenden:

/\(\w\|\s\)

oder:

/\v(\s|\w)

(oder die von Peter Lewerin vorgeschlagene Lösung ).

VanLaser
quelle
2
Nur weil man einen ungültigen Bereich in einer Zeichenklasse erstellen kann, heißt das nicht, dass es nicht möglich sein sollte, so etwas wie \sin einer Zeichenklasse zu verwenden. Die Regex-Implementierung von Vim hat diese Wahl getroffen, aber bei anderen Implementierungen können Sie sie verwenden [\s].
Jamessan
@VanLaser Wenn Sie die Antwort mit diesen Informationen bearbeiten ([\ s] ist in anderen Regex-Implementierungen möglich, aber nicht in vim), akzeptiere ich Ihre Antwort!
John HK
(alles
klar
11

Im Gegensatz zu einigen Implementierungen von Modulen für reguläre Ausdrücke scheint Vim diese Notation ( [\s\w]) in Auflistungen nicht zu unterstützen . Man kann jedoch POSIX-Zeichenklassenausdrücke verwenden .

  • [:blank:]ist das gleiche wie \s.
  • [:space:]stimmt mit einer größeren Anzahl von Leerzeichen überein als dies der \sFall ist und scheint äquivalent zu zu sein \_s.
  • [:alnum:]approximiert \w, stimmt aber nicht mit dem Unterstrich ( _) überein .

Die gewünschte Sammlung könnte also als [[:blank:][:alnum:]_]oder geschrieben werden [[:space:][:alnum:]_].

Ich habe dies nicht durch Tests überprüft, aber es ist dokumentiert in :h regexp, :h /character-classesund :h /collection.

Hinweis zur Portabilität: In anderen Regex-Engines \sist dies in der Regel dasselbe wie in Vim [:space:](oder \_s).

Peter Lewerin
quelle