如何在vimscript中转义搜索模式或正则表达式?

问题描述 投票:5回答:2

我正在用vimscript编写一个vim插件,我需要使用以下命令在另一个文件中搜索光标下当前的单词:

exec 'vimgrep /' . expand('<cword>') . '/g filename'

我需要确保搜索模式中没有正则表达式或斜杠。

如何逃脱这些字符?

regex search escaping vim
2个回答
9
投票

\V开始正则表达式,将其转换为“非常神奇”模式;即仅以反斜杠开头的原子是特殊的。恰好该反斜杠然后通过escape()进行了转义。并且,由于此正则表达式由/.../分隔,因此也必须转义正斜杠。

exec 'vimgrep /\V' . escape(expand('<cword>'), '/\') . '/g filename'

如果不管'ignorecase'设置如何使搜索区分大小写,请添加\C原子:/\V\C...

PS:如果filename可以包含特殊字符(例如%),则也应将其fnameescape()设置为它。


0
投票

\V是您可以使用的理想选择。但是在某些情况下,您可能需要转义字符串,然后将其包含在使用魔术字符的正则表达式中。

在这种情况下(1),我一直在使用这样的函数:

function! EscapeForVimRegexp(str)
  return escape(a:str, '^$.*?/\[]')
endfunction

我不确定这是否可以逃脱它所需要的一切,所以如果您发现任何失败的示例,请告诉我!

注意,如果您的正则表达式将由GNU grep使用,而不是作为Vim正则表达式,那么您可能需要转义一些不同的东西:

function! EscapeForGNURegexp(str)
  return escape(a:str, '^$.*?/\[]()' . '"' . "'")
endfunction

" Example usage
command! FndFunc exec 'grep "\<' . EscapeForGNURegexp(expand('<cword>')) . '(" . -r' | cope
© www.soinside.com 2019 - 2024. All rights reserved.