2014-05-17 40 views

回答

11

你可以用替代命令做到这一点。

:%s/regex/\=setreg('A', submatch(0))/n 

这会将寄存器a附加到正则表达式匹配的任何地方。 n标志将在沙箱中运行该命令,因此没有任何内容会被替换,但语句的副作用将会发生。

你可能想用

:let @a='' 
+1

会不会使用大写字母寄存在'setr​​eg( 'A',子匹配(0))'是更容易? –

+0

@PeterRincker是的,它会。我没有意识到它会接受大写字母(我也没有测试它......) – FDinoff

+4

关于使用大写字母版本的好的部分是你可以使用'setr​​eg()'的第三个参数来使它变成线条化的if你要。 '%s/foo/\ = setreg('A',submatch(0),'V')/ n' –

0

首先清空寄存器。如果你只是想抓住比赛的一部分,你可以用\zs\ze工作。您只需要为多个部分捕获组,或重新排序。

ExtractMatches plugin提供(其中包括)方便:YankMatches命令还支持更换:

:[range]YankMatches[!] /{pattern}/{replacement}/[x] 
0

您也可以抽出两会上针对性的寄存器之间的所有匹配行。

通过示例的方式:

:11,21s/regex/\=setreg('A', submatch(0))/n 

相配从管线11 regrex组到第21行,而不是整个文件。

:/^ab/,/^cd/s/regex/\=setreg('A', submatch(0))/n 

相配从与ab stards与cd到线路的线路regrex基。

更多关于会议:http://vimregex.com/