Vim正则表达式替换为n个字符

时间:2011-09-07 18:33:51

标签: regex vim

我有一个正则表达式用某个字符串替换某个模式,但我想让它更具动态性。

例如,假设我有这个正则表达式:

%s/hello/-----/g

然而,我会喜欢做这样的事情:

%s/hello/-{5}/g

表示用5个破折号替换你好。

有办法做到这一点吗?

最终,我想做这样的事情:

%s/(hello)*/-{\=strlen(\0)}/g

它将用短划线替换仅hello s的字符串的任何实例,其长度等于匹配字符串的长度。

2 个答案:

答案 0 :(得分:24)

%s/\v(hello)*/\=repeat('-',strlen(submatch(0)))/g

答案 1 :(得分:6)

可以自动编辑命令,而不是使用替换命令 进行更换。覆盖事件发生的最简单方法 具有特定字符的搜索模式如下。

  1. 搜索下一次出现的开始。

    /\(hello\)\+
    
  2. 选择匹配的文字直至结束。

    v//e
    
  3. 替换所选文字。

    r-
    
  4. 从步骤1开始重复。

  5. 因此,要自动执行此例程,请运行命令

    :let[@/,@s]=['\(hello\)\+',"//\rv//e\rr-@s"]
    

    并从头开始执行该s寄存器的内容 缓冲区(或其他适当的位置):

    gg@s