Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex:返回的C函数类型_C_Regex - Fatal编程技术网

Regex:返回的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

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

例如:

 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