regex - 如何在 Vim 中多次将搜索到的模式附加到行尾?

标签 regex vim

我有以下字符串。

[ABC-10,some_text],[EDFG-24,some_text2],...等等。

我需要在每行的末尾添加以下内容:ABC#10#EDFG#24#...等等。

这是我的搜索模式。

\\(\\w\\{-}\\)-\\(\\d\\{1,2\\}\\)

我可以进一步使用替换 \1 (字母)和 \2 (数字)来获取模式所需的部分。但如何一次打印所有匹配的模式呢?

如果我写

:%s/search_pattern/&#\1#\2

我只得到第一个匹配模式,即 ABC#10。如何添加所有这些?

最佳答案

对于正则表达式来说这是一项艰巨的任务,因为你必须假设解析整行来插入数据,并且你无法返回再次解析它(除非使用递归,我认为vim 缺乏),所以一个肮脏的选择(只是为了好玩)是使用循环并多次应用相同的正则表达式,例如:

:for i in range(10) | s/\v((\w{-})-(\d{1,2}))(.*\2#\3)@!(.*)$/\1\5#\2#\3/e | endfor

它会对您正在搜索的文本进行分组,并使用非肯定的前瞻断言来检查该部分是否尚未添加。

请注意,我假设同一行中不会有超过十个 block ,因为我不会循环更多次,您可以增加(或减少该数字)。另请注意,对于每一行,vim 都会尝试十次,但它不会提示,因为我使用了 /e 标志来使其静音。

在我的示例中产生的结果:

[ABC-10, some_text], [EDFG-24, some_text2]#ABC#10#EDFG#24

关于regex - 如何在 Vim 中多次将搜索到的模式附加到行尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28479143/

相关文章:

vim fzf 获取选定的单词作为 --query 参数

vim - 为什么 Vim 专家更喜欢缓冲区而不是选项卡?

regex - 从字符串中提取满足长度条件的单词

Python 正则表达式 - 使用先前匹配的字符来匹配字符序列

regex - 最好的 REGEXP 友好文本编辑器 + 最强大的 REGEXP 语法?

regex - 如何从 Set-Cookie 解析多个 cookie 值(包含逗号和分号)

vim - 括号上的 tmux vim 显示问题

正则表达式匹配除模式之外的尾部斜线

python - 为 vim 的 :python command 指定 Python 解释器

vim - .vimrc 中的键映射(重音)和编码问题