我有一个正则表达式用某个字符串替换某个模式,但我想让它更具动态性。
例如,假设我有这个正则表达式:
%s/hello/-----/g
%s/hello/-{5}/g
表示用5个破折号替换你好。
有办法做到这一点吗?
最终,我想做这样的事情:
%s/(hello)*/-{\=strlen(\0)}/g
它将用短划线替换仅hello
s的字符串的任何实例,其长度等于匹配字符串的长度。
答案 0 :(得分:24)
%s/\v(hello)*/\=repeat('-',strlen(submatch(0)))/g
答案 1 :(得分:6)
可以自动编辑命令,而不是使用替换命令 进行更换。覆盖事件发生的最简单方法 具有特定字符的搜索模式如下。
搜索下一次出现的开始。
/\(hello\)\+
选择匹配的文字直至结束。
v//e
替换所选文字。
r-
从步骤1开始重复。
因此,要自动执行此例程,请运行命令
:let[@/,@s]=['\(hello\)\+',"//\rv//e\rr-@s"]
并从头开始执行该s
寄存器的内容
缓冲区(或其他适当的位置):
gg@s