vim将正则表达组的所有匹配记录到注册表中

时间:2014-05-17 16:26:28

标签: regex vim regex-group yank

我知道我可以将所有匹配的行拉入寄存器A,如下所示:

:g/regex/y/A

但我似乎无法弄清楚如何将匹配的正则表达式群体放入注册表A:

:g/\(regex\)/\1y A
(E10: \ should be followed by /, ? or &)

4 个答案:

答案 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))~

这似乎可以满足我的要求。