範囲の次の正規表現があります288-303
が、GVimでは機能しません。正規表現は:/28[89]|29[0-9]|30[0-3]/
です。
誰かが理由を指摘してもらえますか?Stack Overflowを参照し、 http: //utilitymill.com/utility/Regex_For_Range/42から正規表現を取得しました。
範囲の次の正規表現があります288-303
が、GVimでは機能しません。正規表現は:/28[89]|29[0-9]|30[0-3]/
です。
誰かが理由を指摘してもらえますか?Stack Overflowを参照し、 http: //utilitymill.com/utility/Regex_For_Range/42から正規表現を取得しました。
Vimでパイプを脱出する必要があります:
:/28[89]\|29[0-9]\|30[0-3]/
編集:
@Timのコメントによると、オプション\v
で、個々のパイプ文字をエスケープする代わりに、パターンの前にプレフィックスを付けることができます。
:/\v28[89]|29[0-9]|30[0-3]/
@Timに感謝します。
ジムの回答に基づいて、特定の範囲の整数を検索するための小さなスクリプトを作成しました。次のようなコマンドを使用します:
:Range 341 752
これは、2つの数字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)Too many'('
スクリプトは341-399または400-699または700-752の間で表示されます