首页 > 解决方案 > Vim 搜索模式 'foo' 但跳过包含 'bar' 的行而不删除任何行

问题描述

我想使用模式匹配在 vim 中使用搜索和突出显示。我的第一个搜索条件是foo在一行中查找一个字符串。我的第二个搜索条件是跳过所有foo如果同一行包含bar在其中。我不想删除所有包含bar. 我的第一个搜索条件符合以下条件:

/foo

我的第二个标准不符合:

/foo.*\(bar\)\@<!

示例文本:

1 foo
2 foo bar xx
3 fooobar
4 bar
5 xxx

(这里我只想突出显示第 1 行)

我在这里缺少什么?

参考:http: //vimdoc.sourceforge.net/htmldoc/pattern.html

标签: regexsearchvimregular-language

解决方案


您可以使用

/\(bar.*\)\@<!foo\(.*bar\)\@!

非常神奇的模式:

/\v(bar.*)@<!foo(.*bar)@!

细节

  • (bar.*)@<!- 否定的后视:bar在当前位置右侧没有任何 0 个或更多字符
  • foo- 一个字foo
  • (.*bar)@!- 负前瞻:bar不允许在当前位置右侧的任何 0 个或多个字符之后。

推荐阅读