编写正则匹配Vimscript自动加载函数调用的需求与问题
匹配Vimscript自动加载函数调用的正则方案
我来帮你搞定这个Vimscript自动加载函数调用的正则匹配问题!你需要区分自动加载函数的调用(比如foo#bar(、foo#bar#baz()和定义(比如function foo#bar()),之前的负向预查没生效大概率是没考虑到函数定义的变体和空格问题,下面给你一套精准的解决方案:
核心思路
- 先匹配自动加载函数的特征:必须包含至少一个
#分隔的命名空间,结尾是左括号((确保是调用而非单纯的函数名) - 用负向后行断言排除掉前面带有
function或function!(Vim里覆盖函数的定义语法)的情况,同时兼容关键字和函数名之间的任意空白字符
Vim专属正则(推荐,适配Vim的正则语法)
开启very magic模式(用\v前缀)让正则更简洁易读:
\v(function!?\s*)@<!(\w+#)+\w+\(
逐段解释
\v:开启Vim的very magic模式,减少转义符的使用,让正则更直观(function!?\s*)@<!:零宽负向后行断言,确保当前位置前面没有function或function!加上任意空白字符(空格、制表符都算),完美排除函数定义场景(\w+#)+:匹配一个或多个命名空间段,比如foo#、foo#bar#,\w+匹配字母/数字/下划线,符合Vimscript的命名规则\w+:匹配最终的函数名部分\(:匹配左括号,确保这是一个函数调用而非单纯的函数名引用
通用PCRE正则(如果在其他支持PCRE的工具中使用)
如果是在Vim以外的工具(比如代码编辑器的全局搜索),可以用标准PCRE语法:
(?<!function!?\s*)(\w+#)+\w+\(
测试验证
会被匹配的场景(正确的函数调用)
foo#bar() call foo#bar#baz() let output = utils#file#read( "test.txt" )
不会被匹配的场景(函数定义)
function foo#bar() function! myplugin#core#init() function! s#private_helper() " 脚本本地函数定义也会被排除,符合你的需求
内容的提问来源于stack exchange,提问作者Andy Stewart
相关产品推荐
相关产品推荐

