vim正则表达式匹配一对单词

时间:2013-10-05 17:05:10

标签: regex vim lookahead

我希望VIM正则表达式可以选择性地查找单词对。它们可以用其他词分开,但它们都必须在同一条线上。 例如,如果我想匹配打开和关闭,那么这些应匹配:

open foo close
open close
foo

并且这些不匹配:

open foo
open
foo close
close

我尝试使用lookahead和lookbehind匹配单词,但我似乎无法找到合适的组合。

我知道如何为单个角色做这件事,但言语让我完全迷失了。

这是一次尝试:

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

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

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

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

acabcacabbbbcbbb
ac
abc
b

但不会选择

acbbc
ab
bc
a
c

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

非常感谢任何帮助。

谢谢! Nachum

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

2 个答案:

答案 0 :(得分:2)

只需搜索:

open.*close

答案 1 :(得分:0)

我相信这就是你要找的东西。

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

分解为:

(?!.*open|.*close).* - 除开启或关闭之外的任何内容 或
.*open.*close.* - 包括开放和关闭的内容

我对vim并不熟悉,但是根据你所展示的内容,我认为你看起来就像是能够转换语法。