regex - 如何在vim中用大括号括住视觉上选择的文本

标签 regex vim vim-plugin

我有这样的文字:

NAME_1  : "Some name",
VALUE_1 : "Some text",
NAME_2  : "Some name2",
VALUE_2 : "Some text2",
....

如何使用 vim 脚本语言或正则表达式将此文本转换为以下结构:

1 : {
    NAME  : "Some name",
    VALUE : "Some text"
},
2 : {
    NAME  : "Some name2",
    VALUE : "Some text2"
},

我正在研究 Surround.vim 插件。它用大括号很好地包围着。 我尝试修改它以按模式 _(\d+) 进行减去,然后将其添加到大括号之前,但我不太熟悉 vim 脚本,所以我没能做到这一点。

任何建议将不胜感激。

提前致谢。

最佳答案

您只需一个 :substitute 即可完成此操作,使用 \(...\) 捕获组,并在替换部分中重新排列这些子匹配。它之所以复杂,只是因为有多个组需要处理,而且图案跨越两条线。

:%s/^\(\w\+\)_\(\d\+\)\(\s*:\s*.*\)\n\(\w\+\)_\2\(\s*:\s*.*\),$/\2 : {\r    \1\3\r    \4\5\r},/

这匹配两个后续行(注意模式中的 \n)。通过使用第二行中的数字(第二个捕获组),可以确保获取 NAME_1 和相应的 VALUE_2

提示:首先将其构建为搜索 / 更容易,然后只需通过 :%s//... 重用该模式

在替换中,换行符是通过 \r 创建的。您可以在 :help :substitute 下的帮助中找到更详细的说明。

关于regex - 如何在vim中用大括号括住视觉上选择的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23578692/

相关文章:

vim - 如何让 NERDTree 保持在左侧

vim - iTerm2 不渲染 vim 真彩色配色方案

python - 从 python 字符串中删除 markdown 代码块

vim - 如何在 VIM 中写入一些全局变量到 vim 文件

ubuntu - vim 减慢 yaml 文件的 autocompop 速度

eclipse - Eclipse 最有用的 VI/Vim 插件是什么?

vim - 在 vim 中按 O 或 [Return] 时不要插入注释

c++ - 在 C++ [std::regex] 中替换表达式的内容

java - 如何使用正则表达式删除电子邮件地址中的点 (.) 字符

python - Django URL正则表达式不捕获Int