Regex 如何搜索具有一定数量参数的函数

Regex 如何搜索具有一定数量参数的函数,regex,grep,Regex,Grep,给定函数名和函数的参数数量,如何使用egrep和regex列出所有函数定义 例如,函数名为find,我们希望找到的函数find只有三个参数,不多也不少,如下所示: sometype find ( type1 para1 , type2 para 2 , type3 para 3 ) 我试图自己解决这个问题,具体如下: egrep "find" * | egrep "([^,]\*,[^,]\*,[^,]\*)" 但它不起作用。因此,我需要您的帮助,指出我使用的正则表达式的错误,并为我提供您的

给定函数名和函数的参数数量,如何使用egrep和regex列出所有函数定义

例如,函数名为find,我们希望找到的函数find只有三个参数,不多也不少,如下所示:

sometype find ( type1 para1 , type2 para 2 , type3 para 3 )
我试图自己解决这个问题,具体如下:

egrep "find" * | egrep "([^,]\*,[^,]\*,[^,]\*)"

但它不起作用。因此,我需要您的帮助,指出我使用的正则表达式的错误,并为我提供您的名称解决方案:查找参数数量:3个问题(如果可能)。

使用正则表达式是不可靠的,对于egrep更是不可靠的,除非您遵循一些约定,并且不做任何太难的事情

考虑:

void *
function(
    int a,
    void (*pointer)(const char *, int, double),
    double d
)
此声明分布在6行上,而egrep一次只查看一行

此声明包含5个逗号和3个参数

如果你对你正在搜索的代码有足够的限制,你可能会得到一个近似的结果,但是C和C++都是很难分析的。我甚至没有考虑为您调用函数的宏

即使在解决了Tim Pietzcker正确诊断的附加反斜杠问题后,您提出的解决方案也存在许多缺陷:

egrep "find" * | egrep "\([^,]*,[^,]*,[^,]*\)"
这将发现以下行:

find(1, 2, 3);
int extra_find(int a, int b, int c) { ... }
extraordinary(find, 3, 21);
printf("find: %.*s\n", 13, "heliotrope");
for (find(1); printf("%d %d\n", 1, 2); x++)
for (x(find, 1); b < max(c, d); i++)
/* find(1,2,3) */

但它不处理指针、数组、限定符,如“const”,或指针指向函数或引用,如果您使用C++,或由“StuttSoMeMeValNeNT”引用的结构,或保护函数定义不受宏扩展int GETCHARINT C,或…它仍然不能区分声明和定义

你正在逃避*这个你不应该去的地方,因为它实际上是一个量词——现在你正试图从字面上匹配星号。但你应该避开括号

因此:


会更好,但正如Jonathan Leffler所写的那样,这只适用于极少数可能的情况,因此您可能应该考虑另一种方法。

正则表达式如何,如以下Perl:

查找\s+\\s*\w+\s+\w+,\s*\w+\s+\w+,\s*\w+\s+\w+\


克里斯:C++。但在我的例子中,语言类型并不重要。我只是我想让文件名::行号方式中的所有位置符合我提到的模式。关闭-查看我在添加答案时生成的编辑答案。您的正则表达式会找到“extra_findint i,int j,int k”,严格来说,这并不是您想要的。但是,其他答案也没有一个完全符合要求。
perl -ne 'print if m/\bfind\s*\(\w+\s+\w+(\s*,\s*\w+\s+\w+){2}\s*\)/'
\([^,]*(,[^,]*){2}\)