2016-08-25 50 views
2

在vim中,使用正則表達式或模式,如何複製匹配以便將匹配直接放在自身之後,而不替換匹配?在vim中複製正則表達式(正則表達式)匹配

例如,我想在一個行逗號後的一個逗號之前的所有內容複製到:然後

one, 
two, 
three, 
four, 

...會變成:

one,one 
two,two 
three,three 
four,four 

我可以匹配與.*,或與全球%s/.*,。我甚至可以與.*,\@<=甚至.*,\zs進行零寬度匹配。但我無法弄清楚從哪裏出發。

+0

作爲一個方面說明,文檔是在這裏:http://vimdoc.sourceforge.net/htmldoc/pattern.html#pattern-atoms –

回答

4

使用組捕獲。要使用組捕獲,將部分正則表達式放在圓括號之間(它們需要被轉義),然後將其置於子組1中。下一對括號中的所有內容都將放置在子組2中,最多9組。然後,您可以在替換的替換部分中引用該組。例如:

:%s/\(.*\),/\1,\1 

這意味着捕獲任何東西到逗號,並將其稱爲組\1。然後,將該文本替換爲(group1),(group1)。你也可以做

:%s/\(.*\),/&\1 

因爲&意味着 「整個匹配文本」(同\ 0)。

你也可以使用非常神奇的例如\v以使其更具可讀性。例如:

:%s/\v(.*),/&\1 

作爲一個側面說明,簡單的方式來達到同樣的影響是使用:%norm,它適用於一組按鍵的每一個行。例如,你可以做

:%norm yt,f,p 

推薦閱讀:http://vimregex.com/

+0

'魔術「是默認的正則表達式模式。你的意思是「非常神奇」。 – jshort

+0

@jshort好點。我將編輯它。 – DJMcMayhem

+1

或者:':%s/\(。* \),\ zs/\ 1 /' –