2011-03-22 25 views
0

我有一些形式3 *(item1; item2; item3;)的表達式,我想用item1; item2; item3替換它們; ITEM1; ITEM2;項目3; ITEM1; ITEM2;項目3; (即3個方括號內的東西,不包括括號內)替換表單x *(字符串)與該字符串的x個副本的表達式

我可以寫一個正則表達式來提取相關的部分,但我不知道如何做另一部分 - 我有一個玩弄子匹配()和eval(),但我還沒有找到一種方法來連接字符串,以自身的特定次數:

:%s/\(\d+\)\*(\(\_[^)]\+\))/what goes here...?

我曾希望像\ {2 \ 1}會的工作,但是這並不能評估大括號中的數字。如果我以這種錯誤的方式去解決這個問題 - 我並沒有特別想要這樣做,這正是我所知道的,我只是想知道Vim中是否可以輕鬆實現。

如果有人能幫忙,謝謝!

回答

0

不需要自定義功能。你可以用同樣的方式使用內置的repeat()。這裏

%s#\v(\d+)\*\((\_[^)]+)\)#\=repeat(submatch(2), submatch(1))#gc

更多信息:help repeat():help function-list的內置功能列表。

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是更有效的),然後使用:s表達,評價功能...

:%s/\(\d\+\)\*(\([^)]\+\))/\=RepeatString(submatch(1),submatch(2))/g 

(注:有一對夫婦的我正則表達式和你之間的差異,這可能是拼寫錯誤的結果原來的問題)。

+0

非常好,謝謝你。關於差異,我注意到的是一個逃脫+,這是我的一個錯字(如果我現在糾正它,我想這會混淆問題),並且我還在[^]之前有一個\ _] - 我可能應該已經刪除了這個問題,但是我的實際問題需要它,因爲這些項目可能位於不同的行中。再次感謝! – Jonathan 2011-03-22 15:59:40

相關問題