如何使用一定数量的参数搜索函数

给定函数名称和函数具有多少个参数的数量,如何使用egrep和regex列出所有函数定义?如何使用一定数量的参数搜索函数

例如,函数的名称是“发现”我们希望发现这些功能“找到”有只有三个参数,不能多也不能少像下面这样:

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) */

其中只有一个是函数定义,但仍不是您想要的输出之一。

如果您可以使用Perl(或Python)或任何带有PCRE(Perl兼容正则表达式)的工具或同等工具来玩游戏,那么您可以做一些事情,例如确保在单行上单词'find'出现,然后出现左括号,由逗号和空格分隔的“类型名称”值序列以及右括号。

perl -ne 'print if m/\bfind\s*\(\w+\s+\w+(\s*,\s*\w+\s+\w+){2}\s*\)/' 

但是(如果使用的是C++或参考文献),其不处理指针,数组限定符像“常量”,或指针的功能,或由“结构somename VARNAME”,或函数引用结构定义受到宏扩展的保护(int (getchar)(int c)),或者...它仍然不区分声明和定义!

回答:

你正在逃避*你不应该在这里,因为它真的是一个量词 - 现在你试图从字面上匹配星号。但是你应该避开括号。

所以:

\([^,]*(,[^,]*){2}\) 

会更好地工作,但 - 乔纳森·莱弗勒写道 - 只会在可能的情况下,一个非常小的子集,所以你或许应该考虑一下不同的方法。

回答:

怎么样一个正则表达式,如下面(的Perl):

找到\ S + \(\ S * \ w + \ S + \ w + \ S * \ w + \ S + \ w + \ S * \ w + \ s + \ w + \)

以上是 如何使用一定数量的参数搜索函数 的全部内容, 来源链接: utcz.com/qa/267295.html

回到顶部