Vim正则表达式匹配数字范围 - 无法工作

3
我有一个针对范围 288-303 的正则表达式,但在 GVim 中无法使用。该正则表达式是:/28[89]|29[0-9]|30[0-3]/
请问有人可以指出原因吗?我参考了 Stack Overflow,并从此处获取了该正则表达式。
2个回答

12

你必须在 Vim 中转义管道符:

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

编辑:

根据@Tim的评论,您可以选择在模式前加上\v前缀,而不是转义单独的管道字符:

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

谢谢 @Tim。


9
另外,也可以使用“非常魔法”(\v)选项:/\v28[89]|29[0-9]|30[0-3]/ - Tim
OP的示例以:开头,而\v在那里不起作用,但是很好。如果你只是搜索,/\v会起作用(事实上我已经将/重新映射到了/\v),但是如果你从命令行进行搜索,你需要转义管道符。我已经更新了我的答案,添加了OP示例中的: - Jim Stewart
2
抱歉,我关于 :/\v 的理解是错误的;我在测试正则表达式时仍然使用了 \|。你也可以在命令行中使用 \v。这是个好提示! - Jim Stewart

0

根据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>) 

请注意,使用 \%(\) 匹配括号而不是 \(\),可以避免出现“ERROR E872: (NFA regexp) Too many '('” 错误。
该脚本查找341-399、400-699或700-752之间的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接