用纯正则表达式交换单词

Swapping words with pure Regex

我想使用 Vim 中的捕获组交换两个单词,仅使用一行正则表达式,但我找不到解决此问题的方法 例如

word1
word2

expecting:
word2
word1

get:
word1
word2

我也试过了s/(word1)(word2)//g 但他们不交换位置,甚至不更换

有什么办法可以实现吗?

你没有匹配中间的换行符,换行符也没有出现在替换中。

对于捕获组,您可以转义括号:

\(word1\)\n\(word2\)/\r/

输出

word2
word1

如果您想替换所有出现的地方而不必转义括号,您可以使用非常神奇的模式使用 \v 并使用 %s

%s/\v(word1)\n(word2)/\r/g

如果这个词可以传播,你可以在两者之间匹配任何非贪婪的字符,并在替换中使用捕获组。

%s/\v(word1)(\_.{-})(word2)//g

请参阅 this page 以获取大量文档。

我完全赞成在严格的约束下进行设计,但实用主义也有价值。当你可以当场写三个超级简单的命令时,等待别人给你写一个超级花哨的东西有什么好处?

:%s/word1/§§§§/g
:%s/word2/word1/g
:%s/§§§§/word2/g

如果你真的挖掘了 one-liner 的奥秘:

:%s/word1/§§§§/g|%s/word2/word1/g|%s/§§§§/word2/g

我怀疑这正是您要找的东西,但是 Tim Pope 的 Abolish 提供了 :Subvert/:S 命令,可以使交换变得容易

:%S/{foo,bar}/{bar,foo}/gw

这将交换以下内容:

foo -> bar
bar -> foo

:Subvert 采用与 :s 相似的标志。我将 w 用于 word-wise,将 g 用于全局