【发布时间】:2021-12-29 21:19:57
【问题描述】:
假设你有以下 C 函数:
void foo(int a, int b, const char* fmt, ...)
并且您想用bar() 查找/替换foo() 的函数调用
void bar(int a, int b, int c, const char* fmt, ...)
您如何将foo() 的调用与a、b、fmt 周围的捕获组以及可变参数... 匹配?
如果可能的话,我还希望解决方案完全不依赖于参数的数据类型。
我目前的尝试是:foo(\(.*\),\s*\n*\s*\(.*\),\s*\n*\s*\(.*\),\s*\n*\s*\(.*\));
但由于最后的 \(.*\) 不匹配带有通配符的换行符,它会中断。
【问题讨论】:
-
如果唯一的问题是
\(.*\)不匹配换行符,用\(\_.\{-}\)替换它 -
您应该为这个问题提供更多背景信息。如果是一次性的项目变更,一般不值得构建一个详尽的解决方案;只需浏览项目并手动编辑
foo的所有用途。如果需要重复执行(为什么?),您无法正确使用正则表达式,因为它们无法匹配 C 语法的所有可能性(例如带有内部括号和逗号的参数)。预处理器宏可能可以完成这项工作;你可以使用#define foo(a, b, ...) bar((a), (b), c, __VA_ARGS__)。 -
一般来说,处理所有可能的变体是非常棘手的:
foo(hangup(12+catz, 15/dogz), window_size(scr, subwin), "foo(a, b, fmt, arg1, 'd')", atan2(dogz, sqrt(b * b + c * c)))或任何类似的东西如果你尝试用正则表达式来做这件事会让你大吃一惊。我什至没有尝试将 cmets 嵌入到通话中。