2013-03-19 80 views

回答

9

你要逃避Vim的管道:

:/28[89]\|29[0-9]\|30[0-3]/ 

編輯:

每@添的評論,你可以任選\v前綴,而不是逃避個人管字符模式:

:/\v28[89]|29[0-9]|30[0-3]/ 

謝謝@Tim。

+8

另外,可以使用'very magic'('\ v')選項:'/ \ v28 [89] | 29 [0-9 ] | 30 [0-3] /' – Tim 2013-03-19 23:08:52

+0

OP的例子以':'開頭,'\ v'在那裏不起作用,但是很好。如果你只是在搜索,'/ \ v'會起作用(實際上我已經'/'重新映射到'/ \ v'),但是如果你正在從命令行進行搜索,你需要逃避管道。我已經更新了我的答案,從OP的例子中添加':'。 – 2013-03-19 23:11:26

+2

對不起,我錯了':/ \ v';我正在用正則表達式中的'\ |'進行測試。你也可以在命令行上使用'\ v'。好的提示! – 2013-03-19 23:13:56

0

基於吉姆的回答,我做了一個小腳本來搜索給定範圍內的整數。您可以使用命令,如:

:Range 341 752 

這兩個數字341和752之間的 位的每個序列匹配使用搜索像

/\%(3\%(\%(4\%([1-9]\)\)\|\%([5-9]\d\{1}\)\|\%(9\%([0-9]\)\)\)\)\|\%([4-7]\d\{2}\)\|\%(7\%(\%(0\%([0-9]\)\)\|\%([1-5]\d\{1}\)\|\%(5\%([0-2]\)\)\)\) 

只需添加到您的vimrc

function! RangeMatch(min,max) 
    let l:res = RangeSearchRec(a:min,a:max) 
    execute "/" . l:res 
    let @/=l:res 
endfunction 

"TODO if both number don't have same number of digit 
function! RangeSearchRec(min,max) " suppose number with the same number of digit 
if len(a:max) == 1 
    return '[' . a:min . '-' . a:max . ']' 
endif 
if a:min[0] < a:max[0] 
    " on cherche de a:min jusqu'à 99999 x times puis de (a:min[0]+1)*10^x à a:max[0]*10^x 
    let l:zeros=repeat('0',len(a:max)-1) " string (a:min[0]+1 +) 000000 

    let l:res = '\%(' . a:min[0] . '\%(' . RangeSearchRec(a:min[1:], repeat('9',len(a:max)-1)) . '\)\)' " 657 à 699 

    if a:min[0] +1 < a:max[0] 
    let l:res.= '\|' . '\%(' 
    let l:res.= '[' . (a:min[0]+1) . '-' . a:max[0] . ']' 
    let l:res.= '\d\{' . (len(a:max)-1) .'}' . '\)' "700 a 900 
    endif 

    let l:res.= '\|' . '\%(' . a:max[0] . '\%(' . RangeSearchRec(repeat('0',len(a:max)-1) , a:max[1:]) . '\)\)' " 900 a 957 

    return l:res 
else 
    return '\%(' . a:min[0] . RangeSearchRec(a:min[1:],a:max[1:]) . '\)' 
endif 
endfunction 
command! -nargs=* Range call RangeMatch(<f-args>) 

請注意\%(\)匹配括號而不是\(\)可避免錯誤E872:(NFA regexp)太多'('

腳本看起來在341-399或400-699或700-752之間