在Vim中,如何仅在模式出现一次时才进行匹配?

时间:2019-07-30 17:47:57

标签: regex vim

我有以下文字:

Line 1 : orange blackberry orange coconut
Line 2 : orange
Line 3 : blackberry coconut blackberry
Line 4 : pear orange apricot

我想查找“橙色”仅出现一次的行,即第2行和第4行(对于“ blackberry”,它仅是第1行)。

我尝试使用否定的超前构造(橙色,橙色表示),但失败了……

/orange\(.*orange\)\@!

在第2行和第4行给了我,但正如我应该预见的那样,在第1行给了橙色的第二个实例。

我应该如何进行?

预先感谢

1 个答案:

答案 0 :(得分:7)

您可以使用

/\(orange.*\)\@<!orange\(.*orange\)\@!

其中

  • \(orange.*\)\@<!-否定的“向后看”,确保在线上当前位置之前没有orange
  • orange-一个orange子字符串
  • \(.*orange\)\@!-否定的“前瞻”,可确保在该行的当前位置之后没有orange

非常魔术模式符号:

/\v(orange.*)@<!orange(.*orange)@!