Regex Vim语法突出显示(正则表达式)

Regex Vim语法突出显示(正则表达式),regex,vim,vim-syntax-highlighting,Regex,Vim,Vim Syntax Highlighting,我试图使用c.Vim插件突出显示Vim中的一个成员变量 例如,在 struct sockaddr_in sa; sa.sin_family = AF_INET; 我想突出显示sinu family 下面是我的语法匹配代码: syn match cCustomMember "\(\.\)\@<=[a-zA-Z0-9_]\+\s*\((\)\@!" hi def link cCustomMember Number .msg和.code突出显示,但最后一个字母未突出显示。但我不想突出显示

我试图使用c.Vim插件突出显示Vim中的一个成员变量

例如,在

struct sockaddr_in sa;
sa.sin_family = AF_INET;
我想突出显示sinu family

下面是我的语法匹配代码:

syn match   cCustomMember "\(\.\)\@<=[a-zA-Z0-9_]\+\s*\((\)\@!"
hi def link cCustomMember Number
.msg和.code突出显示,但最后一个字母未突出显示。但我不想突出显示成员函数(以圆括号结尾)

我认为这有点类似于python中的正则表达式问题:

a = re.compile("(?<=\.)(?:\w+)(?!\()")
print a.search(".test(").group() #produces tes, which it's desired to match nothing
print a.search(".test").group()  # produces test
a=re.compile(“(”解释
你正在努力解决的问题是,现代正则表达式引擎在寻找匹配项时的基本运行方式。Jan Goyvaerts在他的帖子“”中简明扼要地说:

当注册引擎通知一个与字符串中的下一个字符不匹配的正则表达式时,将进行回溯。然后,该正则表达式将备份到目前为止匹配的部分内容,以尝试不同的方法和/或代表。这一过程将使所有猜测和理解为什么一个规则表达式匹配它做什么和不做什么之间存在差异

在您的情况下,当lookahead断言匹配时,正则表达式引擎将回溯,测试匹配的较短组合–以及
.cod
.ms
do。下面显示了发生的情况,垂直条将正则表达式已经使用的字符与字符串的其余部分分隔开来
.code()

请注意,只有在使用贪婪量词时,这才是正确的,就像在代码中一样;惰性量词将匹配
.c
。请参阅

解决方案 解决这个问题的一个明显方法是在前瞻之前禁止回溯,有效地“锁定”regex已经使用的模式部分:成员函数永远不会匹配。一些正则表达式引擎允许您使用甚至是(这本质上是原子分组的语法糖)——更为人所知的是那些在前面链接的页面上列出的

另一种不那么直接、也更为脆弱的方法是重新定义您要查找的内容:与其使用与开头参数匹配的负先行断言,不如使用与所有有效字符匹配的正先行断言,将成员变量与其他代码分隔开(空格、逗号、分号、结束符、行尾–更多信息,请查看来源)-基本上除了开头符和另一个名称字符以外的任何字符。我将让您将其翻译为。

解释 你正在努力解决的问题是,现代正则表达式引擎在寻找匹配项时的基本运行方式。Jan Goyvaerts在他的帖子“”中简明扼要地说:

当注册引擎通知一个与字符串中的下一个字符不匹配的正则表达式时,将进行回溯。然后,该正则表达式将备份到目前为止匹配的部分内容,以尝试不同的方法和/或代表。这一过程将使所有猜测和理解为什么一个规则表达式匹配它做什么和不做什么之间存在差异

在您的情况下,当lookahead断言匹配时,正则表达式引擎将回溯,测试匹配的较短组合–以及
.cod
.ms
do。下面显示了发生的情况,垂直条将正则表达式已经使用的字符与字符串的其余部分分隔开来
.code()

请注意,只有在使用贪婪量词时,这才是正确的,就像在代码中一样;惰性量词将匹配
.c
。请参阅

解决方案 解决这个问题的一个明显方法是在前瞻之前禁止回溯,有效地“锁定”regex已经使用的模式部分:成员函数永远不会匹配。一些正则表达式引擎允许您使用甚至是(这本质上是原子分组的语法糖)——更为人所知的是那些在前面链接的页面上列出的


另一种不那么直接、也更为脆弱的方法是重新定义您要查找的内容:与其使用与开头参数匹配的负先行断言,不如使用与所有有效字符匹配的正先行断言,将成员变量与其他代码分隔开(空格、逗号、分号、结束符、行尾-查看您的源代码了解更多信息)-基本上除了开头符和另一个名称字符以外的任何字符。我将把它留给您翻译成。

arh,没关系,我知道了。应该是\@取决于您来自哪里(Perl、Python、Emacs?)您可能想探索四种(我想是四种)正则表达式“模式”中的一种。还可以尝试阅读关于\v和“magic”的帮助。我来自python。可以设置vi的正则表达式模式??我更新了这个问题,我认为这是一个正确的问题。啊,没关系,我明白了。应该是\@取决于您来自哪里(Perl、python、Emacs?)您可能想探索四种(我想是四种)Regex“模式”中的一种。还可以尝试阅读有关\v和“magic”的帮助“。我来自python。可以设置vi的正则表达式模式??我更新了问题,我认为这是一个正确的问题。谢谢你的详细解释。我将尝试积极展望。谢谢你的详细解释。我将尝试积极展望。”。
a = re.compile("(?<=\.)(?:\w+)(?!\()")
print a.search(".test(").group() #produces tes, which it's desired to match nothing
print a.search(".test").group()  # produces test
.|code()   # good start => try next char
.c|ode()   # matches => try next char
.co|de()   # matches => try next char
.cod|e()   # matches => try next char
.code|()   # whoops, next char is "(" => track back
.cod|e()   # matches => we’re done here