Я просто попытался (наивно) собрать макрос для верхнего регистра произвольного набора зарезервированных слов SQL.

:nnoremap <leader>c :s/\(\<use\>\)\|\(\<create\>\)\|\(\<select\>\)\|\(\<update\>\)\|\(\<delete\>\)\|\(\<not\>\)\|\(\<null\>\)\|\(\<unique\>\)\|\(\<constraint\>\)\|\(\<references\>\)\|\(\<join\>\)\|\(\<on\>\)\|\(\<inner\>\)\|\(\<outer\>\)\|\(\<left\>\)\|\(\<group\>\)\|\(\<order\>\)\|\(\<having\>\)\|\(\<by\>\)/\U&/g<CR>

Макрос записан в мой .vimrc, который загружается нормально. Но когда я запускаю макрос, Vim выдает некоторые ошибки:

E872: (NFA regexp) Too many '('
E51: Too many \(
E476: Invalid command

Я искал, но ничего не нашел, чтобы указать, что есть ограничения на регулярные выражения. Я лучше всего понимаю ошибки, что мне не удалось что-то правильно избежать, но я не могу этого найти.

Я здесь превысил какой-то лимит регулярных выражений?

vim
5
Nate Kennedy 26 Апр 2016 в 18:08

2 ответа

Лучший ответ

Дело не в ограничении количества символов в регулярном выражении, а в ограничении количества групп в вашем регулярном выражении.

Vim может обрабатывать не более 10 групп регулярных выражений (\0....\9), я не считал ваши коды, но у вас должно быть более 10 групп в вашем регулярном выражении.

Константа (10) была определена в regexp.h

https://github.com/vim/vim/blob/0b9e4d1224522791c0dbbd45742cbd688be823f3/src/regexp.h#L22

И он использовался для проверки регулярного выражения пользователя, как здесь:

https://github.com/vim/vim/blob/af98a49dd0ef1661b4998f118151fddbf6e4df75/src/regexp.c#L1539

3
Kent 26 Апр 2016 в 15:34

У вас могут быть только шаблоны захвата \ 1 .. \ 9. Если вам нужно больше группировок, но не нужно захватывать их все, вы можете использовать группы без захвата с синтаксисом \%(pattern\):

/abc\%(def\)ghi/
5
Droj 21 Апр 2017 в 02:58