正则表达式:返回类型的C函数

时间:2014-01-11 18:03:30

标签: c regex

我正在尝试编写一个正则表达式,它会在C文件中给我只返回类型任何(参见编辑)C函数,忽略空格和换行符,但我不是好运。 编辑:我必须考虑的返回类型只是基本的C data types

示例:

 signed    
     long    long 
    int function1   ( int j, int n)

应该给我:

signed long long int

我如何编写(或想出一个解决方案)这个正则表达式?

2 个答案:

答案 0 :(得分:1)

问题中最困难的部分可能是回答这个问题:“我怎么知道我已经达到了函数定义的开始”。鉴于C的各种规则,目前尚不清楚是否存在“确定无效”的答案 - 所以你可能做的最好的事情是提出一个能够捕获“大多数”情况的规则。

函数定义将具有

  • 具有可能限定符的返回类型(void, signed, unsigned, short, long, char, int, float, double, *)
  • 中的一个或多个
  • 后跟一个字
  • 后面是一个左括号。

这意味着这样的事情应该有效:(演示:http://regex101.com/r/oJ3xS5

((?:(?:void|unsigned|signed|long|short|float|double|int|char|\*)(?:\s*))+)(\w+)\s*\(

注意 - 这不会“清理格式化” - 因此跨越多行的返回值定义仍然会这样做。它确实具有优势(与其他解决方案相比),它专门针对您问题中链接中定义的基本类型。

另请注意 - 您需要g标志来捕获所有实例;我在自己的捕获组(\w+)中捕获函数名称本身。如果您不想/不需要,可以省略括号。但我认为同时使用返回类型和函数名称可能很有用。

事后补充:如果你首先删除多个空格并返回,上面的内容仍然有效,但现在返回值中没有多余的空格。例如,您可以通过

运行代码
cat source.c | tr '\n' ' ' | sed 's/\s+/ /' > strippedSource.c

然后使用上面的正则表达式处理。

答案 1 :(得分:0)

使用OR运算符连接所有单词:

\b((void|unsigned|signed|char|short|int|long|float|double)\s*)+\b

开始和结束时的\b是为了防止弹出部分功能名称(void longjmp会浮现在脑海中)。

这不会捕获uchar_8之类的typedef,或者void (* int)(*)之类复杂的指针到指针结构(我刚刚做了这个,它可能没有任何意义)。