在vim中复制正则表达式(正则表达式)匹配

时间:2016-08-25 19:37:17

标签: regex vim

在vim中,使用正则表达式或模式,如何复制匹配以便匹配直接放在自身之后,而不替换匹配?

例如,我想在一行逗号前复制所有内容,然后复制到逗号后面:

one,
two,
three,
four,

......然后会变成:

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

我可以与.*,匹配,也可以与%s/.*,全局匹配。我甚至可以使用.*,\@<=甚至.*,\zs进行零宽度匹配。但我无法弄清楚从哪里开始。

1 个答案:

答案 0 :(得分:6)

使用群组捕获。要使用组捕获,请将正则表达式的一部分放在括号之间(它们需要转义),然后将它们放在第1组中。下一对括号中的所有内容都将放在第二组等中,最多可放置9组。然后,您可以在替换的替换部分中引用此组。例如:

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

这意味着捕获任何逗号,并将其称为组\1。然后,将此文本替换为(group1),(group1)。你也可以这样做

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

因为&表示“整个匹配的文本”(与\ 0相同)。

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

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

作为旁注,实现相同效果的更简单方法是使用:%norm,它将一组击键应用于每一行。例如,你可以做

:%norm yt,f,p

推荐阅读:http://vimregex.com/

相关问题