Regex in Vi: Jak używać klas postaci w grupach? (np. [\ s \ w])

15

W Vimie klasa znaków \spasuje do dowolnego znaku spacji. Kiedy używam tych znaków specjalnych w grupach, np [\s\w]. Nie pasuje do żadnego pojedynczego spacji lub znaku, pasuje slub w.

Jak używać klas postaci w grupach?

John HK
źródło
8
W przeciwieństwie do niektórych implementacji mechanizmów wyrażeń regularnych, Vim nie obsługuje tej notacji. [[:space:][:alnum:]_]może być użyty do przybliżenia kolekcji \si \w.
Peter Lewerin
@PeterLewerin Prześlij to jako odpowiedź.
Christopher Bottoms
@ChristopherBottoms: gotowe.
Peter Lewerin

Odpowiedzi:

11

To nie jest grupa, to zakres, aw Vimie nie można używać klas postaci (chociaż jest to możliwe w innych implementacjach wyrażeń regularnych, np. W pythonie ). Zamiast tego musisz użyć alternacji :

/\(\w\|\s\)

lub:

/\v(\s|\w)

(lub rozwiązanie zaproponowane przez Petera Lewerina ).

VanLaser
źródło
2
To, że można skonstruować nieprawidłowy zakres w klasie znaków, nie oznacza, że ​​nie powinno być możliwe użycie czegoś takiego jak \sw klasie znaków. Zdarza się, że implementacja wyrażeń regularnych Vima dokonała tego wyboru, ale inne implementacje pozwalają na użycie [\s].
jamessan
@VanLaser Jeśli edytujesz odpowiedź za pomocą tych informacji ([\ s] jest możliwe w innych implementacjach wyrażeń regularnych, ale nie w vimie), zaakceptuję twoją odpowiedź!
John HK
(w porządku, dodano)
VanLaser
11

W przeciwieństwie do niektórych implementacji mechanizmów wyrażeń regularnych, Vim nie obsługuje tej notacji ( [\s\w]) w kolekcjach. Można jednak użyć wyrażeń klasy znaków POSIX .

  • [:blank:]jest taki sam jak \s.
  • [:space:]dopasowuje większą liczbę białych znaków niż \srobi i wydaje się być równoważne \_s.
  • [:alnum:]jest przybliżona \w, ale nie pasuje do podkreślenia ( _).

Tak więc kolekcję, którą chciałeś, można zapisać jako [[:blank:][:alnum:]_]lub [[:space:][:alnum:]_].

Nie zweryfikowano testując to, ale to jest udokumentowane :h regexp, :h /character-classesoraz :h /collection.

Uwaga dotycząca przenośności: w innych silnikach wyrażeń regularnych \sjest zwykle taki sam, jak [:space:](lub \_s) w Vimie.

Peter Lewerin
źródło