Vim语法区域-回顾混淆

4

在 .vimrc 文件中定义以下内容或在 vim 命令行中执行:

syn match ndbMethods "[^. \t\n\r]\@<=[_a-z][_a-zA-Z0-9]*(\@="
hi ndbMethods guibg=#222222

使用C风格的方法调用在活动缓冲区中查看结果:

foo();

你会发现方法名的初始字符不匹配。
意图是让lookbehind模式强制在任何匹配方法的第一个字符之前出现行首、文字"."或空格。
奇怪的是,将此设置为负向先行断言(\@<!)似乎有效!
有没有人能够友好地解释一下为什么这个lookbehind是错误的?

1
在vim中有一个相当奇怪的特性:[^\n]将匹配任何字符,包括换行符。集合内的[\n]始终将换行符添加到匹配项中,无论您是否在开头使用^。为避免混淆,请始终使用等效于[\n]\_[]变体。 - ZyX
1个回答

10
更新:f处,向后查找时,您可能需要检查[. \t\n\r],而不是[^. \t\n\r]。因为当前,您正在说“不遵循这些字符之一的东西”,所以只有在达到o时才满足该条件,因为f确实不是这些字符之一。因此,您必须取消否定字符类,或者像您发现的那样,否定回溯。

我认为你对术语也感到困惑了。

\@<=    positive lookbehind
\@<!    negative lookbehind
\@=     positive lookahead
\@!     negative lookahead

啊,这就是我的问题 - 我把 '^' 放在了字符集的开头!它本来是用来匹配行首的,所以应该放在字符集内的非初始位置。将其改为 [. \t\n\r^] 就可以解决问题了。非常感谢您的帖子 :-) - KomodoDave
@acheong87 别忘了,[^. \t\n\r] 匹配任何不是句点、空格、制表符或回车符的字符,包括换行符。请参见:h /[\n] - ZyX
@KomodoDave 集合内的 ^ 永远不会匹配行首。它要么否定集合(除了 \n),要么匹配字面上的 ^。最好写成 \%(^\|[. \t]\)\@<=,因为在文本中通常不应出现 \r(如果您使用 dos 行尾并使用适当的文件格式进行编辑,则 \r\n 将被压缩为单个行分隔符,而 \r 将永远不会匹配),并且 \n 不会匹配第一行开头。 - ZyX
(忽略上述双转义,它们旨在作为单个转义以克服 SO 评论格式) - KomodoDave
我选择了这个:\(^|[. \t\n\r]\)@<=,它似乎工作得很好。如果你有机会,请告诉我关于那个百分号的事情! - KomodoDave
显示剩余6条评论

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