【问题标题】:Vim syntax region - lookbehind confusionVim 语法区域 - 后向混淆
【发布时间】:2012-08-27 17:19:39
【问题描述】:

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

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

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

foo();

你会看到方法名的首字母不匹配。

其目的是让后向模式强制在任何匹配方法的第一个字符之前使用行首、文字 . 或空格。

奇怪的是,将其设为负前瞻 (\@&lt;!) 似乎可行!

有人能解释一下为什么这个lookbehind是不正确的吗?

【问题讨论】:

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

标签: regex vim syntax match lookbehind


【解决方案1】:

更新:f,向后看,您可能想要检查[. \t\n\r],而不是[^. \t\n\r]。因为目前,您说的是“遵循这些字符之一的东西”,所以只有在达到 o 时才满足条件,因为 f 确实不是其中之一人物。因此,您必须取消否定字符类,或者如您所见,否定后向。

我认为你也把你的术语弄糊涂了。

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

【讨论】:

  • 天哪,我的目的是为了 [^. \t\n\r] 成为后视者! \@ssiaf.blogspot.co.uk/2009/07/negative-lookbehind-in-vim.html。他在那里使用的lookbehind肯定和我的一样,除了我有包含'。'的字符类。等代替他的(开始)
  • 啊,这是我的问题——我在字符集的开头添加了“^”!它旨在匹配行首,因此应该位于该字符集中的非初始位置。更改为 [。 \t\n\r^] 修复它。衷心感谢您的帖子:-)
  • 我一路跌跌撞撞,但很乐意提供帮助。
  • @acheong87 不要忘记,[^. \t\n\r] 匹配任何不是点、空格、制表符或回车符的字符,包括换行符。见:h /[\n]
  • @KomodoDave ^ 内部集合永远不会匹配行的开头。它将否定集合(\n 除外)或匹配文字 ^。最好写成\%(^\|[. \t]\)\@&lt;=,因为\r 通常不应出现在文本中(如果您有dos 行结尾并使用正确的文件格式进行编辑,\r\n 将被压缩为单行分隔符,\r 将永远不会匹配) 和 \n 不会在第一行的开头匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2013-10-09
相关资源
最近更新 更多