Регулярные выражения vim с точки зрения Perl: какие специальные символы экранировать с помощью обратной косой черты

Представьте, нам нужно построить регулярное выражение в vi/vim. Какие специальные символы мы должны экранировать с помощью обратной косой черты?

Под специальными символами я подразумеваю следующие символы: {}|()-[]+*.^$?

Похоже, нам нужно сбежать: {|()+?

И оставить как есть: }^$*.[]-

Спасибо.

p.s. Насколько я знаю, у нас нет '?' символ в vi/vim, но вместо него следует использовать '=', который также должен быть экранирован обратной косой чертой.


person igorp1024    schedule 05.11.2009    source источник
comment
\? и \= выполняют одну и ту же работу. Если вы активируете очень волшебный режим, то .? будет означать один или ни одного символа.   -  person ZyX    schedule 19.03.2011


Ответы (3)


В ВИМ:

:помочь волшебство

person Jogusa    schedule 06.11.2009

Я думаю, что документация Vim по магическим символам даст вам окончательный список.

person Brian Agnew    schedule 05.11.2009

Я думаю, что самый простой способ, который будет работать независимо от настройки vim magic, это

let re = '\V' . escape(fixed_string, '\')

\V полностью отключает магию с этого момента в RE. Это означает, что любой символ, которому не предшествует одна обратная косая черта (ну, технически нечетное количество обратных косых черт), является обычным символом. Поскольку мы избегаем обратной косой черты в фиксированной строке, в ней не может содержаться магических символов.

Помните, что при действии \V вы должны ставить обратную косую черту перед любыми метасимволами RE. Итак, если вы ищете строку, полностью состоящую из фиксированной строки, вы бы

let full_line_re = '\V\^' . escape(fixed_string, '\') . '\$'

Также имейте в виду, что настройки vim ignorecase и smartcase будут влиять на поведение RE. Переключатели \C (с учетом регистра) и \c (без учета регистра) работают так же, как \V: они переопределяют эти настройки для той части любого регулярного выражения, которая следует за ними.

person intuited    schedule 19.03.2011
comment
Одно дополнение к этому ответу: вы даже можете использовать следующий шаблон: \v^.+(\VThis is not a meta character: .\v)+. Здесь использование похоже на \Q...\E в Perl. - person ZyX; 19.03.2011
comment
Для переопределения параметра «игнорировать регистр» вы также можете использовать =~# и =~?, если вы хотите сопоставление с образцом. В другом случае вы должны указать \c или \C. - person ZyX; 19.03.2011