regex - 在 Vim 中,如何交换 2 个不相邻的模式?

标签 regex vim

我有几行文本,都具有相同的结构,并且希望在所有行上对 2 个元素进行排列:

1257654 some text (which may be long) #Foo
1543098 some other text #Barbar
1238769 whatever #Baz
2456874 something else #Quux

我想获得:
#Foo some text (which may be long) 1257654
#Barbar some other text 1543098
#Baz whatever 1238769
#Quux something else 2456874

这就是我被困的地方:
:%s/\(\d\{7\}\)\(#.\{-}\)/\2\1/

我哪里做错了 ?

最佳答案

您替换的问题在于您只有两组而不是三组。

您的目标是交换 13附近2 :

(1)(2)(3) --> (3)(2)(1)

所以你的模式中需要有三个组:
(1543098)( some other text )(#Barbar)

能够做到:
(#Barbar)( some other text )(1543098)

这种替代似乎有效:
:s/^\(\d\{7\}\)\(.*\)\(#\w*\)/\3\2\1

感谢 verymagic,这里有一个更短更漂亮的版本:
:s/\v^(\d{7})(.*)(#\w*)/\3\2\1`

关于regex - 在 Vim 中,如何交换 2 个不相邻的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12697768/

相关文章:

bash - 更改 Netrw 目录列表中突出显示栏的颜色?

r - 使用 data.table 提取指定关键字之间的字符串的第一个实例的最佳方法

regex - 将 url(r'^(?P<pk>[-\w]+)/$') 解码为 Django 中的 path()

regex - 我该如何处理这个正则表达式问题?

regex - 删除标签之外的文本

vim - 在不使用箭头键的情况下选择 vim 模糊查找器中的文件?

java.util.Pattern 只匹配一个替代组?

regex - 用数组替换项目周围的括号

vim - 我可以在VIM中的寄存器中保存当前窗口位置和缓冲区吗

vim - 根据目录设置 Vim 的 shiftwidth 和 tabstop