vim - vimgrep 可以与环视断言一起使用吗?

标签 vim regex-lookarounds vimgrep

我正在尝试在一个大型 JavaScript 项目上自动执行一些文本操作,并希望使用 vimgrep 跳转到匹配项,我将在后面调用各种宏。

我的目标行是这样的:

getText("foo", 1)

但是,不是这样的:

getText("foo")
getText("foo", [1])

我只想匹配具有多个参数且未包含在数组中的 getText 用法。

此搜索查询 (/) 使用否定的前瞻性,似乎有效:

getText(.*",\(.*[\)\@!

但是,用 vimgrep 运行这个正则表达式:

:vimgrep /getText(.*",\(.*[\)\@!/ project/src/**/*.js

...失败并显示此消息:

E682: Invalid search pattern or delimiter

我怀疑我的正则表达式的前瞻部分是原因,因为当我删除它时错误消失了。

有没有办法通过 vimgrep 使用环视断言?

最佳答案

:vimgrep 将每个搜索到的文件加载到 Vim 缓冲区中,然后对它应用 Vim 的正则表达式搜索。因此,与 'grepprg'/:grep 等外部工具不同,您可以在此处使用完整的 Vim 正则表达式语法。

正如@Matt 已经评论过的,E682 是由于未能转义[ 引起的。当您在常规 / 搜索中使用表达式时,Vim 只是将 [ 视为文字字符,作为 collection未正确关闭 - 您的搜索按预期工作。

:vimgrep ,但是 {pattern} 必须用 /.../ 定界符括起来。显然,解析器继续寻找结尾的 /,但找不到它,因为尚未关闭的 [ 集合一直在消耗字符,这导致了错误。这种不一致并不好,它显然让你绊倒了,但它不一定是错的。现在你知道了:-)

只需将 [ 字符正确转义为 \[,它就会起作用:

:vimgrep /getText(.*",\(.*\[\)\@!/ project/src/**/*.js

有特殊的正则表达式原子(\v\V)改变转义的数量;有些人喜欢使用它们(以避免过度转义,或为了更好的可读性)——我主要发现解释中的必要转变会分散注意力。

关于vim - vimgrep 可以与环视断言一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58986971/

相关文章:

regex - 提高 PCRE 正则表达式模式的性能

search - 是否可以使用 vimgrep 对当前文件进行可视化选择?

vim - 我应该按什么键来激活 vim 中的 c_CTRL-D?

javascript - 我如何在这个正则表达式中自己编写一种转义字符?

regex - 匹配不包含所有指定元素的字符串的正则表达式

vim - 我的 vimgrep 搜索没有像我预期的那样运行

使用 Vimgrep 搜索由多个 glob 指定的文件集

linux - Vim colorscheme 在启动时加载 - linux ubuntu gnome 终端

python - VIM - 未知功能 : pythoncomplete#Complete

vim - latex /VIM : change all $$ . 。 $$ 到\begin{equation} ....\end{equation}