我有一些表格3 *(item1; item2; item3;),我想用item1替换它们; item2; item3; item1; item2; item3; item1; item2; item3; (即括号中的3个批次,不包括括号)
我可以写一个正则表达式来提取相关部分,但我不知道如何做其他部分 - 我玩了一下submatch()和eval(),但我还没找到办法将字符串连接到自身特定次数:
:%s/\(\d+\)\*(\(\_[^)]\+\))/what goes here...?
我曾希望像\ 2 {\ 1}这样的东西可以工作,但是这并没有评估大括号中的数字。如果我以错误的方式解决这个问题 - 我并不特别喜欢这样做,这就是我所知道的,我只是想知道在Vim中是否很容易实现。
谢谢,如果有人可以提供帮助!
答案 0 :(得分:0)
您可以定义一个重复复制字符串的函数...
function! RepeatString(n,s)
let l:result=""
let l:n=a:n
while l:n>0
let l:result = l:result . a:s
let l:n = l:n-1
endwhile
return l:result
endfunction
(注意:如果n很大,这是非常低效的;很可能是,例如,制作一个列表并调用join
更有效率)然后使用{{1}的表达式评估功能} ...
:s
(注意:我的正则表达式与您的正则表达式之间存在一些差异,这可能是原始问题中拼写错误的结果)。
答案 1 :(得分:0)
无需自定义功能。您可以以相同的方式使用内置repeat()
。
%s#\v(\d+)\*\((\_[^)]+)\)#\=repeat(submatch(2), submatch(1))#gc
有关内置函数列表的更多信息:help repeat()
和:help function-list
。