我只是尝试(天真地)将一个宏放在一起,用于大写一组任意 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>
Run Code Online (Sandbox Code Playgroud)
宏被写入我的 .vimrc,它加载得很好。但是当我运行宏时,Vim 会抛出一些错误:
E872: (NFA regexp) Too many '('
E51: Too many \(
E476: Invalid command
Run Code Online (Sandbox Code Playgroud)
我一直在四处寻找,但没有发现任何迹象表明正则表达式存在限制。我对错误的最佳解读是我未能正确逃脱某些东西,但我找不到它。
我在这里是否超出了正则表达式的一些限制?
您只能拥有捕获模式 \1..\9。如果您需要更多分组,但不需要全部捕获,您可以使用非捕获组的\%(pattern\)语法:
/abc\%(def\)ghi/
Run Code Online (Sandbox Code Playgroud)
这与正则表达式中的字符限制无关,而是与正则表达式中的组数限制有关。
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