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

时间:2010-02-09 13:51:10

标签: regex grep

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

例如,函数的名称是“find”,我们期望找到那些只有三个参数的“find”函数,不多也不少如下:

sometype find ( type1 para1 , type2 para 2 , type3 para 3 )

我试着自己解决这个问题:

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

但它不起作用。所以我需要你的帮助来指出我使用的正则表达式有什么问题,如果可能的话,给我解决“名称:查找参数数量:3”的问题。

3 个答案:

答案 0 :(得分:5)

使用正则表达式是不可靠的,加倍于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*\)/'

但是它不处理指针,数组,限定符如'const',或指向函数的指针(或引用,如果您使用的是C ++),或者由'struct somename varname'引用的结构,或者函数定义受宏保护扩展(int (getchar)(int c)),或......它仍然不区分声明和定义!

答案 1 :(得分:2)

你正在逃避*你不应该去的地方,因为它确实是一个量词 - 现在你试图按字面意思匹配星号。但你应该逃避括号。

所以:

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

会更好,但是 - 正如Jonathan Leffler写的那样 - 只会在很小的可能情况下工作,所以你应该考虑采用不同的方法。

答案 2 :(得分:1)

正则表达式如下(Perl):

找到\ S + \(\ S * \ W + \ S + \ W +,\ S * \ W + \ S + \ W +,\ S * \ W + \ S + \ W + \)