我正在尝试编写一个正则表达式,它会在C文件中给我只返回类型任何(参见编辑)C函数,忽略空格和换行符,但我不是好运。 编辑:我必须考虑的返回类型只是基本的C data types
示例:
signed
long long
int function1 ( int j, int n)
应该给我:
signed long long int
我如何编写(或想出一个解决方案)这个正则表达式?
答案 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)(*)
之类复杂的指针到指针结构(我刚刚做了这个,它可能没有任何意义)。