【问题标题】:Vim search pattern 'foo' but skip lines containing 'bar' without deleting any lineVim 搜索模式 'foo' 但跳过包含 'bar' 的行而不删除任何行
【发布时间】:2020-05-28 11:29:48
【问题描述】:

我想使用模式匹配在 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

【问题讨论】:

  • 等一下,这是否意味着你想要一个完整的单词匹配 bar
  • 没有,我的示例文本有误,现在已修复。我想跳过所有带有 bar 的行。但是您以任何方式想出了解决方案:D
  • 好的,我将答案回滚到版本 1。
  • 你太快了@WiktorStribiżew,谢谢你的回答。我对单个答案的多个疑问得到了清除。

标签: regex search vim regular-language


【解决方案1】:

你可以使用

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

非常神奇的模式:

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

详情

  • (bar.*)@&lt;! - 否定的后视:没有 bar 后跟任何 0 个或多个字符到当前位置的右侧
  • foo - 一句话foo
  • (.*bar)@! - 否定前瞻:不允许在当前位置右侧的任何 0 个或多个字符之后使用 bar

【讨论】:

  • 我知道我的数据栏中的一件事总是稍后出现,所以我没有使用lookbehind。我的错误是将.*foo 保持在一起,而不是保持在原子栏内。第二个错误是使用@&lt;! 而不是@!
猜你喜欢
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
相关资源
最近更新 更多