Jon*_*ink 2 vim vimgrep regex-lookarounds
我正在尝试在一个大型JavaScript项目上自动执行一些文本操作,并希望使用跳转到匹配项vimgrep,随后将进行各种宏调用。
我的目标行如下所示:
getText("foo", 1)
Run Code Online (Sandbox Code Playgroud)
但是,不是这样的:
getText("foo")
getText("foo", [1])
Run Code Online (Sandbox Code Playgroud)
我只想匹配getText具有多个参数(未包含在数组中)的用法。
这种/使用否定前瞻的搜索查询()似乎有效:
getText(.*",\(.*[\)\@!
Run Code Online (Sandbox Code Playgroud)
但是,使用以下命令运行此正则表达式vimgrep:
:vimgrep /getText(.*",\(.*[\)\@!/ project/src/**/*.js
Run Code Online (Sandbox Code Playgroud)
...失败,显示以下消息:
E682: Invalid search pattern or delimiter
Run Code Online (Sandbox Code Playgroud)
我怀疑正则表达式的超前部分是原因,因为删除它后错误消失了。
有没有办法利用环顾断言vimgrep?
:vimgrep将每个搜索到的文件加载到Vim缓冲区中,然后对它应用Vim的正则表达式搜索。因此,不同于外部工具'grepprg'/ :grep,您可以在此处使用完整的Vim正则表达式语法。
正如@Matt已经评论过的,E682是由于未能转义引起的[。当您在常规/搜索中使用表达式时,Vim只会将[视为文字字符,因为该集合未正确关闭-搜索将按预期进行。
在中:vimgrep,{pattern}必须用/.../定界符将括起来。显然,解析器继续寻找结尾/,但是找不到,因为尚未关闭的[collection一直在消耗字符,这会导致错误。这种不一致不是很好,并且显然使您迷失了方向,但这不一定是错误的。现在你知道了 :-)
只需将[字符转义为\[,即可使用:
:vimgrep /getText(.*",\(.*\[\)\@!/ project/src/**/*.js
Run Code Online (Sandbox Code Playgroud)
有一些特殊的正则表达式原子(\v和\V)会改变逃逸的数量;有些人喜欢使用它们(以避免过度转义,或为了更好的可读性)-我主要发现解释上的必要转移会分散注意力。