Регулярное выражение в Vi: Как использовать классы символов внутри групп? (например, [\ s \ w])

15

В Vim класс символов \sсоответствует любому пробелу. Когда я использую эти специальные символы в группах, например, [\s\w]он не соответствует ни одному пробелу или символу слова, он соответствует sили w.

Как использовать классы персонажей внутри групп?

Джон Х.К.
источник
8
В отличие от некоторых реализаций движков регулярных выражений, Vim, похоже, не поддерживает эту нотацию. [[:space:][:alnum:]_]может быть использован для приблизительного сбора \sи \w, хотя.
Питер Леверин
@PeterLewerin Пожалуйста, опубликуйте это как ответ.
Кристофер Боттомс,
@ChristopherBottoms: сделано.
Питер Леверин

Ответы:

11

Это не группа, это диапазон, и в Vim вы не можете использовать классы символов (хотя это возможно в других реализациях регулярных выражений, например, в Python ). Вместо этого вам придется использовать чередование :

/\(\w\|\s\)

или:

/\v(\s|\w)

(или, то предложенное решение от Peter Lewerin ).

VanLaser
источник
2
Тот факт, что в классе символов можно создать недопустимый диапазон, не означает, что нельзя использовать что-то подобное \sв классе символов. Реализация регулярного выражения в Vim сделала этот выбор, но другие реализации позволяют вам использовать [\s].
Jamessan
@VanLaser Если вы отредактируете ответ с этой информацией ([\ s] возможно в других реализациях regex, но не в vim), я приму ваш ответ!
Джон Х.К.
(все в порядке, добавлено)
VanLaser
11

В отличие от некоторых реализаций движков регулярных выражений, Vim, похоже, не поддерживает эту нотацию ( [\s\w]) в коллекциях. Однако можно использовать выражения класса символов POSIX .

  • [:blank:]так же, как \s.
  • [:space:]соответствует большему количеству пробельных символов, чем \sделает, и кажется эквивалентным \_s.
  • [:alnum:]приблизительно \w, но не соответствует подчеркиванию ( _).

Таким образом, коллекция, которую вы хотели, может быть записана как [[:blank:][:alnum:]_]или [[:space:][:alnum:]_].

Я не проверил это путем тестирования, но документировано в :h regexp, :h /character-classesи :h /collection.

Примечание о переносимости: в других движках регулярных выражений, \sкак правило, совпадает с[:space:] (или \_s) в Vim.

Питер Леверин
источник