Gre*_*ill 28 regex vim negative-lookahead
在Vim中,有没有办法搜索匹配的行abc
但是xyz
后面还不包含该行?所以以下几行将匹配:
The abc is the best
The first three letters are abc
Run Code Online (Sandbox Code Playgroud)
并且以下内容不匹配:
The abc is the best but xyz is cheaper
The first three letters are abc and the last are xyz
Run Code Online (Sandbox Code Playgroud)
我知道如下语法:
/abc\(xyz\)\@!
Run Code Online (Sandbox Code Playgroud)
但这只是避免匹配,abcxyz
而不是中间是否有任何东西,例如abc-xyz
.运用
/abc.*\(xyz\)\@!
Run Code Online (Sandbox Code Playgroud)
也不起作用,因为后面的线路中有许多位置xyz
不匹配.
(我应该注意,在命令行上我会做类似的事情,grep abc <infile | grep -v xyz
但我想在Vim中以交互方式进行上述操作.)
Ing*_*kat 32
你的尝试非常接近; 你需要拉动.*
它允许匹配和后面的不匹配之间的任意距离进入负前瞻:
/abc\(.*xyz\)\@!
Run Code Online (Sandbox Code Playgroud)
我猜这是有效的,因为尝试了所有可能匹配的非匹配.*
,并且只有当所有分支都已用尽时才\@!
声明为已满足.
尽管您的问题与前瞻有关,但我在寻找后向搜索时发现了它。因此,我将解决方案发布到后面,以便其他人可以找到它。
如果您搜索的内容pattern2
不以pattern1
开头,则后面为负数,请搜索:
\(pattern1\)\@<!pattern2
Run Code Online (Sandbox Code Playgroud)
我总是觉得很奇怪,您需要在vim中转义括号,因此我大多数时候尝试使用“非常魔术”模式,并通过\v
以下方式激活:
/\vabc(.*xyz)@!
Run Code Online (Sandbox Code Playgroud)