Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 数字范围的Vim正则表达式-不工作_Regex_Vim - Fatal编程技术网

Regex 数字范围的Vim正则表达式-不工作

Regex 数字范围的Vim正则表达式-不工作,regex,vim,Regex,Vim,我有以下范围288-303的正则表达式,但它在GVim中不起作用。 regexp是:/28[89]| 29[0-9]| 30[0-3]/ 谁能指出原因吗。我引用了堆栈溢出并从中获取了regexp。您必须在Vim中逃离管道: :/28[89]\|29[0-9]\|30[0-3]/ 编辑: 根据@Tim的注释,您可以选择使用\v作为模式前缀,而不是转义单个管道字符: :/\v28[89]|29[0-9]|30[0-3]/ 谢谢@Tim。基于Jim的回答,我制作了一个小脚本来搜索给定范围内的整数。

我有以下范围
288-303
的正则表达式,但它在GVim中不起作用。 regexp是
:/28[89]| 29[0-9]| 30[0-3]/


谁能指出原因吗。我引用了堆栈溢出并从中获取了regexp。

您必须在Vim中逃离管道:

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

根据@Tim的注释,您可以选择使用
\v
作为模式前缀,而不是转义单个管道字符:

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

谢谢@Tim。

基于Jim的回答,我制作了一个小脚本来搜索给定范围内的整数。您可以使用如下命令:

: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>) 
函数!范围匹配(最小值、最大值)
设l:res=RangeSearchRec(a:min,a:max)
执行“/”。l:是的
设@/=l:res
端功能
“如果两个数字的位数不相同,则执行TODO
函数!RangeSearchRec(最小值,最大值)“假设数字的位数相同
如果len(a:max)=1
返回'['.a:min.'-'.a:max.']'
恩迪夫
如果a:min[0]
注意,匹配括号的\%(\)而不是\(\)避免了错误E872:(NFA regexp)过多的'('


脚本看起来介于341-399或400-699或700-752之间

或者,可以使用“非常神奇的”(
\v
)选项:
/\v28[89]| 29[0-9]| 30[0-3]/
OP的示例以
开始,并且
\v
在那里不起作用,但很好。如果您只是在搜索,
/\v
会起作用(事实上,我已将
/
重新映射到
/\v
),但如果您是从命令行执行搜索,则需要跳出管道。我已更新了我的答案,以添加OP示例中的
。抱歉,我对
:/\v
的理解是错误的;我正在使用仍在正则表达式中的
\\\
测试它。您也可以在命令行中使用
\v
。提示不错!