我知道我可以将所有匹配的行拉入寄存器A,如下所示:
:g/regex/y/A
但我似乎无法弄清楚如何将匹配的正则表达式群体放入注册表A:
:g/\(regex\)/\1y A
(E10: \ should be followed by /, ? or &)
答案 0 :(得分:12)
您可以使用替换命令执行此操作。
:%s/regex/\=setreg('A', submatch(0))/n
这会将寄存器a附加到正则表达式匹配的任何内容中。 n
标志将在沙箱中运行命令,因此实际上不会替换任何内容,但会发生语句的副作用。
你可能想先用
清空寄存器:let @a=''
答案 1 :(得分:0)
如果您只想获取匹配的一部分,则可以使用\zs
和\ze
。您只需要多个部件的捕获组,或重新排序。
我的ExtractMatches plugin提供(以及其他)方便的:YankMatches
命令,该命令也支持替换:
:[range]YankMatches[!] /{pattern}/{replacement}/[x]
答案 2 :(得分:0)
您还可以将两个会话之间的所有匹配行拉到指向寄存器。
举例来说:
2*(h-1) + 1 <= max(root-1, n-root) <= 2^h - 1
将第11行到第21行的regrex组匹配,而不是整个文件。
:11,21s/regex/\=setreg('A', submatch(0))/n
将regrex小组从与:/^ab/,/^cd/s/regex/\=setreg('A', submatch(0))/n
对齐的行与ab
对齐。
有关会话的更多信息:http://vimregex.com/
答案 3 :(得分:0)
使用/n
标志对我不起作用-寄存器中没有任何内容-没有它,vim在行上没有替代项。
最终得到:
:g/pat1/s~pat2\\(regex\\)pat3~\=submatch(0).setreg('a',submatch(1))~
这似乎可以满足我的要求。