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

bea*_*mit 14 regex vim

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

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

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

但是,我会喜欢这样做:

%s/hello/-{5}/g

这意味着用5个破折号替换你好.

有没有办法做到这一点?

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

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

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

Pet*_*ker 24

%s/\v(hello)*/\=repeat('-',strlen(submatch(0)))/g
Run Code Online (Sandbox Code Playgroud)

  • 或者`function-list`.有时它更方便. (3认同)

ib.*_*ib. 6

可以自动执行编辑命令以执行替换,而不是使用替换命令.用手特别重写具有特定字符的搜索模式的最简单方法如下.

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

    /\(hello\)\+
    
    Run Code Online (Sandbox Code Playgroud)
  2. 选择匹配的文本直到结束.

    v//e
    
    Run Code Online (Sandbox Code Playgroud)
  3. 替换所选文本.

    r-
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从步骤1开始重复.

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

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

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

gg@s
Run Code Online (Sandbox Code Playgroud)