Vim中如何在一个正则表达式中使用负向前瞻和负向后顾?

10

我正在尝试将Sublime Text中的正则表达式转换为Vim可以使用的格式:

(?<![>\w\d])(42|45|21)\s(?!days)

我想匹配42、45和21,它们不是紧跟着<字符、单词字符或数字出现,并且后面不是单词“days”。

例如,我想在下面的语句中找到42:

This is a reference to chapter 42 in the book.

但不包括以下内容:

This is a reference to chapter <a href="#">42</a>. This is a reference to chapter <a href="#">42 section 35</a>. This book took 42 days to write.

我对正则表达式一般比较陌生,对Vim更是毫无头绪,请谅解。


你在结尾处多了一个 ) - 这是问题所在,还是只是复制/粘贴错误? - Joe
1个回答

17

明白了

\([>]\)\@<!\<\(4[25]\|21\)\( days\)\@!

或者

\v([>])@<!<(4[25]|21)( days)@!

正如您所看到的,vim中的环视语法不同,并且您有多种使用正则表达式进行搜索的模式。我通常使用nomagicvery magic

花些时间查看魔术模式的帮助::help /magic

编辑

现在它也包括45和21


14
以下是针对理解难度较高的人的分解说明:\v 表示 very magic,使得 Vim 的正则表达式更像其他软件。(pattern)@<! 是负向回顾后发断言,(pattern)@! 是负向先行断言。 - Christian Rondeau

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