Regex:返回的C函数类型
我正在尝试编写一个正则表达式,它只给我一个C文件中任何(参见编辑)C函数的返回类型,忽略空格和换行符,但是我没有任何运气。 编辑:我必须考虑的返回类型仅仅是基本的 例如:Regex:返回的C函数类型,c,regex,C,Regex,我正在尝试编写一个正则表达式,它只给我一个C文件中任何(参见编辑)C函数的返回类型,忽略空格和换行符,但是我没有任何运气。 编辑:我必须考虑的返回类型仅仅是基本的 例如: signed long long int function1 ( int j, int n) 你应该给我: signed long long int 如何编写(或思考)此正则表达式的解决方案?使用or运算符连接所有单词: \b((void|unsigned|signed|char|s
signed
long long
int function1 ( int j, int n)
你应该给我:
signed long long int
如何编写(或思考)此正则表达式的解决方案?使用or运算符连接所有单词:
\b((void|unsigned|signed|char|short|int|long|float|double)\s*)+\b
开始和结束处的\b
用于防止出现部分函数名(void longjmp
)
这不会捕获类型定义,例如
uchar_8
,或者复杂的指针指向指针构造,例如void(*int)(*)
(我只是编造了这个,它可能没有任何意义)。问题最难的部分可能是回答以下问题:“我如何判断我已经到达了函数定义的起点”。考虑到C语言的各种规则,还不清楚是否有一个“可靠”的答案——因此,您可能能做的最好的事情就是想出一个规则来捕捉“大多数”情况
函数定义将具有
- 带有可能限定符的返回类型(一个或多个
void、signed、unsigned、short、long、char、int、float、double、*)
- 后面跟着一个词
- 后跟一个开括号
g
标志来捕获所有实例;我在它自己的捕获组(\w+)
中捕获函数名本身。如果你不想/不需要,可以省略括号。但是我认为同时拥有返回类型和函数名可能会很有用
事后思考:如果首先去掉多个空格并返回,上述操作仍然有效,但现在返回值中没有多余的空格。例如,您可以运行您的代码
cat source.c | tr '\n' ' ' | sed 's/\s+/ /' > strippedSource.c
然后使用上面的正则表达式进行处理。Related:注意,返回函数指针的函数是令人讨厌的。您不能这样做。正则表达式无法识别C类型的语言。然后是需要考虑的预处理器-您是否希望识别像
RETURN\u回调(函数,name\u var)int(*函数(char*name\u var))(void*,int)这样的宏的用法
?你想做什么?@Gilles我想制定一个灵活的规则。我不关心预处理器-我只需要考虑基础和指针,这将返回变量类型,而不仅仅是函数返回类型。我想,仅仅添加一个前瞻(?=\()
可能是不够的。
cat source.c | tr '\n' ' ' | sed 's/\s+/ /' > strippedSource.c