2

我想要一个 VIM 正则表达式来选择性地查找成对的单词。它们可以用其他词分隔,但它们必须在同一行。例如,如果我想匹配 open 和 close 那么这些应该匹配:

open foo close
open close
foo

这些不应该匹配:

open foo
open
foo close
close

我曾尝试使用前瞻和后瞻来匹配单词,但我似乎无法找到正确的组合。

我知道如何为单个字符执行此操作,但文字让我完全迷失了方向。

这是一个尝试:

s/\(\(open\)\@=.*\(close\)\@=\)*

对于同样的事情,但使用 'a' 和 'c' 而不是 'open' 和 'close' 我可以这样做:

s/^\(a[^ac]*c\|[^ac]\)*$

这将选择所有这些行(和一个空行):

acabcacabbbbcbbb
ac
abc
b

但不会选择

acbbc
ab
bc
a
c

这是我正在寻找的功能,但有文字。

任何帮助将不胜感激。

谢谢!纳楚姆

编辑:我正在编写一个缩进脚本,这会有所帮助。相反,我最终搜索并将单词转换为单个字母。然后我使用我已经熟悉的方法来匹配单个字符。至少它会在第一次转换完成后缩短代码。

4

2 回答 2

2

只需搜索这个:

open.*close
于 2013-10-05T17:10:57.837 回答
0

我相信这就是您正在寻找的。

^((?!.*open|.*close).*|.*open.*close.*)$

分解为:

(?!.*open|.*close).*- 除开盘或收盘外的任何事物

.*open.*close.*- 包括开盘和收盘的事物

我对 vim 不熟悉,但是从您所展示的内容来看,我认为您看起来可以转换语法。

于 2013-10-05T20:30:30.623 回答