Regex VIM:替换不带参数的函数调用

Regex VIM:替换不带参数的函数调用,regex,vim,replace,Regex,Vim,Replace,在没有函数参数的情况下,如何搜索和替换函数调用 简而言之,我将从foobar(arg1,arg2)搜索并替换为foobar:arg1,arg2 我的目标是保持arg1、arg2 我怎样才能解决这个问题?是否有最佳做法?您可以搜索 (foobar)(\()(arg1, arg2)(\)) 并将其替换为 \1: \3; () 所以,在VIM中,它可能类似于 :s/(foobar)(\()(arg1, arg2)(\))/\1: \3;/g 这里有一种方法可以处理任意命名的参数: :%s/\(\

在没有函数参数的情况下,如何搜索和替换函数调用

简而言之,我将从
foobar(arg1,arg2)
搜索并替换为
foobar:arg1,arg2

我的目标是保持
arg1、arg2

我怎样才能解决这个问题?是否有最佳做法?

您可以搜索

(foobar)(\()(arg1, arg2)(\))
并将其替换为

\1: \3;
()

所以,在VIM中,它可能类似于

:s/(foobar)(\()(arg1, arg2)(\))/\1: \3;/g

这里有一种方法可以处理任意命名的参数:

:%s/\(\<foobar\)(\(.*\))/\1: \2;/g
:%s/\(\使用以下命令:

:%s/\v(\w+)\(([^()]*)\)/\1: \2;/g
注意如果存在嵌套函数调用,则此操作不起作用

请参阅。

尝试以下操作:

在文件顶部插入一行-我们将在此处写入宏。(这是字母O,不是零。)

有关搜索后跟打开参数的一串单词字符并将光标保留在匹配末尾的说明

/\w*(/e<Ctrl-V><Ctrl-M>
跳回另一个括号(再次使用ctrl字母O,而不是零)

然后再次执行该宏(假设它在
q
寄存器中)

宏完成后,退出插入模式(您的行应为:
/\w*(/e^M%r;^Os:^[@q
现在)

最后,重要的时刻:执行我们在
@q
寄存器中构建的递归宏,它将转换整个文件

@q
优点:它正确处理嵌套函数,因为它不依赖于捕获括号匹配有困难的正则表达式。相反,我们依赖
%
命令来匹配括号

演示:

变成

foo: bar, baz;
foo: foo: bar;, baz: ;, foo: foo, foo, foo;;
foo: bar: baz: ;;;

编辑:键入(
\w
,而不是搜索中的
\e

谢谢。遗憾的是,这并不能解决参数的问题。没有修复。谢谢。遗憾的是,这并不能解决参数的问题。没有修复。我可能表达了自己的错误,对此表示抱歉。
<Ctrl-V><Ctrl-O>
s:<Space><Ctrl-V><Esc>
@q
<Esc>
"qdd
@q
foo(bar, baz)
foo(foo(bar), baz(), foo(foo, foo, foo))
foo(bar(baz()))
foo: bar, baz;
foo: foo: bar;, baz: ;, foo: foo, foo, foo;;
foo: bar: baz: ;;;