我有以下正則表達式範圍288-303
但它不適用於GVim。 正則表達式是:/28[89]|29[0-9]|30[0-3]/
。Vim正則表達式的數字範圍 - 不工作
任何人都可以請指出原因。我提到堆棧溢出並從http://utilitymill.com/utility/Regex_For_Range/42得到了正則表達式。
我有以下正則表達式範圍288-303
但它不適用於GVim。 正則表達式是:/28[89]|29[0-9]|30[0-3]/
。Vim正則表達式的數字範圍 - 不工作
任何人都可以請指出原因。我提到堆棧溢出並從http://utilitymill.com/utility/Regex_For_Range/42得到了正則表達式。
你要逃避Vim的管道:
:/28[89]\|29[0-9]\|30[0-3]/
編輯:
每@添的評論,你可以任選\v
前綴,而不是逃避個人管字符模式:
:/\v28[89]|29[0-9]|30[0-3]/
謝謝@Tim。
基於吉姆的回答,我做了一個小腳本來搜索給定範圍內的整數。您可以使用命令,如:
: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之間
另外,可以使用'very magic'('\ v')選項:'/ \ v28 [89] | 29 [0-9 ] | 30 [0-3] /' – Tim 2013-03-19 23:08:52
OP的例子以':'開頭,'\ v'在那裏不起作用,但是很好。如果你只是在搜索,'/ \ v'會起作用(實際上我已經'/'重新映射到'/ \ v'),但是如果你正在從命令行進行搜索,你需要逃避管道。我已經更新了我的答案,從OP的例子中添加':'。 – 2013-03-19 23:11:26
對不起,我錯了':/ \ v';我正在用正則表達式中的'\ |'進行測試。你也可以在命令行上使用'\ v'。好的提示! – 2013-03-19 23:13:56