regex - vim 搜索正则表达式替换为寄存器

标签 regex perl vim

我想用 vim 搜索正则表达式模式,并用寄存器中的粘贴替换匹配项。详细的意思是:

acb123acb
asokqwdad
def442ads
asduiosdf
df567hjk

应该以

结束
acbXYZacb
asokqwdad
defPOWads
asduiosdf
dafMANhjk

我在哪里

XYZ
POW
MAN

在寄存器 A (:g/pattern/y A)

要搜索的正则表达式模式可能是 [0-9]{3},以匹配文本 block 中的 3 个数字。

如果匹配之间没有线条, block 模式会有所帮助......

因此我当然可以使用 perl 脚本。但是我敢肯定,如果可能的话,在 vim 中它会快得多,对吧?

提前致谢

最佳答案

如果你想用相同的值替换所有匹配 [0-9]{3} 的字符串,这恰好是寄存器 a 的内容:

:%s/\v\d{3}/\=@a/g

详细说明:

  • :% - 应用于缓冲区中的所有行
  • s/.../.../g - 替换所有出现的地方
  • \v - 接下来是一个“非常神奇”的正则表达式
  • \d{3} - 匹配 3 位数字
  • \= - 替换为...的值
  • @a - 注册a

另一方面,如果您想从寄存器 a 中读取替换值:

:let a=getreg('a', 1, 1)
:%s/\v\d{3}/\=remove(a, 0)/g

详细说明:

  • let a=getreg('a', 1, 1) - 将寄存器 a 的内容转移到列表中,想象中也命名为 a
  • 然后和上面一样,除了...
  • remove(a, 0) - 删除列表 a 中的第一个元素并返回它。

此外,遗憾的是,VimL 的速度远不及 Perl。 :)

关于regex - vim 搜索正则表达式替换为寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717916/

相关文章:

regex - 验证 Salesforce ID

java - 在 jtextfield 中验证 'price' 的正则表达式是什么

python - 如何将没有数字字符的字母字符与 Python 正则表达式匹配?

vim - Sublime Text 2 配置 - 让空间保存文件

vim - 检查视觉模式

java - 在 VIM 中开发 Java 有哪些好的插件?

c - 使用 perl 更新 C 文件中的宏

Perl - eval 不捕获 "use"语句

arrays - Perl:匿名数组的模板?

用于登录 TopCoder 的 Perl 脚本