如何将Vim正则匹配到的分组字符串存入变量
Vim 正则捕获组的使用方法
Vim 中不存在 Perl 里$1、$2这类全局捕获组变量,有两种更灵活的方式实现相同需求:
方法1:用matchlist()提取所有捕获组
matchlist(待匹配字符串, 正则表达式)会返回数组,第0项是完整匹配结果,第1项对应第一个捕获组,第2项对应第二个捕获组,以此类推,和Perl的分组顺序完全对应。
你原有代码中错误的let l:class_name = \1可以修改为:
if l:line =~ 'class\s\+\(\S\+\)' let l:match_result = matchlist(l:line, 'class\s\+\(\S\+\)') let l:class_name = l:match_result[1] endif
方法2:用\zs、\ze直接定位目标内容(更简洁)
如果只需要提取单个匹配片段,可以用Vim正则特有的\zs(匹配起始位置)和\ze(匹配结束位置)直接标记要提取的部分,配合matchstr()可以一步拿到结果,不需要额外处理捕获组:
let l:class_name = matchstr(l:line, 'class\s\+\zs\S\+')
如果l:line符合匹配规则,就会直接返回类名字符串,不符合则返回空值。
优化后的完整函数示例
以下函数可以直接返回当前文件所有类名的列表,比逐行while循环写法更简洁:
function! ListAllClasses() let l:classes = [] " 遍历文件所有行 for l:line in getline(1, '$') let l:name = matchstr(l:line, 'class\s\+\zs\S\+') if !empty(l:name) call add(l:classes, l:name) endif endfor " 打印结果,也可以根据需求修改为返回值 echo join(l:classes, "\n") return l:classes endfunction
内容的提问来源于stack exchange,提问作者SujithHiremath
相关产品推荐
相关产品推荐

