为什么这个正则表达式在 Vim 语法高亮中不起作用?

Why does this regular expression not work in Vim syntax highlighting?

我正在尝试为 Vim 创建自己的 Python 语法高亮文件。

我试图突出显示 class 继承对象和我创建的正则表达式 适用于各种正则表达式测试器,但不适用于 Vim。我读到 Vim 的正则表达式接近 Perl 风格 所以这就是我一直在使用的。

我试图在以下文本中突出显示 'Subscribers' 一词:

class Divisions(Subscribers):

我编写的正则表达式是:

(?!:class\s\w+)(?<=\()\w+(?=\):)

老实说,我在努力使用量词进行负向回顾时无意中发现了这个问题, 我现在明白这是不可能的。我正在尝试非捕获组 (?:class\s\w+) 并且不小心 插入感叹号 'magically' 解决了问题。至少在我使用的多个正则表达式测试器中是这样。

为了清楚起见,然后在后面看一下 (?<=() 以捕获但不包括 '(' 然后在单词 (?=):) 之后向前看以捕获但不包括结束符 '):'

我已将它添加到我的 Vim 语法文件中:

syn match pythonClassInherit "(?!:class\s\w+)(?<=\()\w+(?=\):)"

这是 Vim 中的有效正则表达式吗?如果没有,有人可以为 Vim 提供可行的解决方案吗?

在线正则表达式游乐场不支持 Vim 的语法,因此在这里使用它们毫无意义。

请参阅 vimregex.com 了解概述,:help usr_27 了解详细教程,:help pattern 了解权威参考,:help perl-patterns 了解 Vim 语法和 Perl 语法。

编辑:我意识到我把问题复杂化了;你只需要一个正确的 Vim 正则表达式。尝试

syntax match pythonClassInherit "\%(class\s\+\h\w*\s*(\s*\)\@<=\h\w*\%(\s*):\)\@="
highlight link pythonClassInherit pythonImport

然后你会看到结果:

您可以将 pythonImport 替换为另一个预定义的高亮组。

对于突出显示,我发现 https://learnvimscriptthehardway.stevelosh.com/(突出显示从第 45 章开始)很有帮助。至于正则表达式,romainl 的建议很棒。


我的第一次尝试是使用正则表达式 \zs。这与 \@<= 不同,要求语法组覆盖 \zs 之前的部分,这不能满足,因为其他组已经占据了该部分。这给我带来了一个复杂的解决方案,通过覆盖默认高亮组以包含一个新组(对于 Subscribers)。但事实证明我们真的不需要。

如果有兴趣,请参阅 Vim syntax file not matching with \zs