Vim 正则表达式:在模式中间使用否定匹配

3
我正在尝试学习vim中的正则表达式,并卡在了以下任务上:
我想要进行替换,匹配所有以下行 - 以及类似的行 - 除了包含“Look aXXhead”的行。类似的行指的是介于a和head之间的任何内容,除了XX。
Look ahead
Look aYhead
Look aXhead 
Look aXXhead    
Look aXXXhead   

如果相关的话,我在尝试时抱有最高的期望。
:%s/Look a\(XX\)\@!head/*\0
:%s/Look a\(.*\&\(XX\)\@!\)head/*\0

由于\(XX\)\@!的零宽度,只匹配Look ahead。我猜测。

尝试像这样:

:%s/Look a\(XX\)\@!.*head/*\0

错过了“三倍X”线。
那么,如何实现呢?
P.S. 这是我在Stack Exchange上的第一篇帖子,请在需要时帮助和纠正我,以防有更好的方式或地点提出此问题。
2个回答

2

尝试使用这个模式:

/\(Look aXXhead\)\@!\&Look a.*head/

这段内容分为两个部分:

  • \(Look aXXhead\)\@!

    在文件的每个位置匹配,但不匹配/Look aXXhead/

  • Look a.*head

    也匹配/Look aXXhead/

\&运算符表示这两个部分必须同时匹配同一位置。


完美运行!(采用了肯特的建议,因为它似乎更简洁。) - Stalpotaten

1
如何编程:
/\vLook a(XXhead)@!.*head

或者没有非常神奇:
/Look a\(XXhead\)\@!.*head

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接