Vim对正则表达式有字符限制吗?

时间:2016-04-26 15:08:59

标签: vim

我只是试图(天真地)将一个用于上层的宏组合成一组任意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

我一直在寻找,但没有发现任何迹象表明正则表达式有限制。我对这些错误的最佳解读是,我没有正确地逃避某些事情,但我无法找到它。

我是否在这里超过了正则表达式的限制?

2 个答案:

答案 0 :(得分:4)

你只能拥有捕捉模式\ 1 .. \ 9。如果您需要更多分组,但不需要全部捕获它们,则可以使用\%(pattern\)语法的非捕获组:

/abc\%(def\)ghi/

答案 1 :(得分:2)

这与正则表达式中字符的限制无关,它与正则表达式中的组数限制有关。

Vim可以处理最多10个正则表达式组,(Database --> Querying),我没有计算你的代码,但你的正则表达式中你应该有10个以上的组。

常量(10)在\0....\9

中定义

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

它用于验证用户的正则表达式,如下所示:

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