我正在尝试搜索包含一组单词的任何排列的行(不区分大小写)。例如,如果我对foo
and感兴趣bar
,我想匹配前四行,而不是下面的最后四行file
:
Foo and bar.
Bar and foo.
The foo and the bar.
The bar and the foo.
Foobar.
Barfoo.
The foobar.
The barfoo.
看过这篇文章后,我意识到我可以在以下位置构建类似的东西perl
:
perl -n -e 'print if (/\bfoo\b.*?\bbar\b/i || /\bbar\b.*?\bfoo\b/i)' file
仅正确匹配前四行。或者,使用本文建议的前瞻结构,可以使用更简洁的代码进行匹配:
perl -n -e 'print if (/(?=.*\bfoo\b)(?=.*\bbar\b)/i)' file
但是,我无法弄清楚如何用vim
正则表达式语法编写这些,我发现它比perl
正则表达式语法更加拜占庭式。我在vim
使用搜索功能(/
或?
)时尝试了许多不同的表达式,但没有一个能产生成功的匹配。我意识到,而不是使用的(?=string)
语法perl
,vim
使用\(string\)\@=
和string\&
。
然而,各种尝试,例如:
\c\(foo\)\@=\(bar\)@=
\c\(foo\)\@=\.*\(bar\)@=
\cfoo\&bar\&
(where\c
用于不区分大小写的匹配)都失败了。
有人可以演示正确的vim
语法吗?