C Regex查找特定函数的所有调用,而不是其声明

C Regex查找特定函数的所有调用,而不是其声明,c,regex,C,Regex,我需要编写一个正则表达式,它只匹配C函数调用的行,而不是它的声明 因此,我需要它只匹配行,其中funcName()前面没有int、double、float、char等和任意数量的空格 问题是,我会遇到以下表达式: printf("Hello"); int f() {return 1;}; 因此,我甚至必须考虑在日期类型名称之前还有其他字符的情况。 myStruct f(); 在这种情况下,我希望正则表达式与之匹配,只应排除基本数据类型 到目前为止,我得到了这个表达式: ^(?!(void

我需要编写一个正则表达式,它只匹配C函数调用的行,而不是它的声明

因此,我需要它只匹配行,其中
funcName()
前面没有
int
double
float
char
等和任意数量的空格


问题是,我会遇到以下表达式:

printf("Hello"); int f() {return 1;};
因此,我甚至必须考虑在日期类型名称之前还有其他字符的情况。

myStruct f();
在这种情况下,我希望正则表达式与之匹配,只应排除基本数据类型


到目前为止,我得到了这个表达式:

^(?!(void|int|double|char))\s*f\(\).*$

但我不知道如何处理类型名称前面有字符的情况。

以下正则表达式符合您的规范:

myStruct f();
(^|((^|\s)(?!(void|int|double|char))[^\s]+)\s+)([a-zA-Z_]+\(\)?)
  • 函数名由包含字母和下划线的字符类定义
  • 该行以函数调用开始,或
  • 该行在函数名之前至少包含一个非空白字符。那样的话。。。
    • 此非WS序列与排除的关键字不匹配
    • 函数名前至少有1个WS字符
请在观看现场演示

警告

正如一些评论者所指出的,这不是一个可靠的解决方案。它只适用于一组严格约束的函数调用和声明模式


基于regex的通用解决方案(如果可能的话,这将严重依赖于可用的regex引擎功能)仅在理论上有意义,因为它必须完全模拟C预处理器。

以下regex符合您的规格:

(^|((^|\s)(?!(void|int|double|char))[^\s]+)\s+)([a-zA-Z_]+\(\)?)
  • 函数名由包含字母和下划线的字符类定义
  • 该行以函数调用开始,或
  • 该行在函数名之前至少包含一个非空白字符。那样的话。。。
    • 此非WS序列与排除的关键字不匹配
    • 函数名前至少有1个WS字符
请在观看现场演示

警告

正如一些评论者所指出的,这不是一个可靠的解决方案。它只适用于一组严格约束的函数调用和声明模式


一个基于正则表达式的通用解决方案(如果可能的话,这在很大程度上取决于可用的正则表达式引擎功能)将只在理论上有意义,因为它必须完全模仿C预处理器。

如果您的行以分号结尾,这意味着它不是一个函数声明,我说的对吗?你应该知道,任何通用的解决方案都需要挂接在预处理器和解析器之间(或者必须是一个成熟的预处理器本身)。@collapsar我知道,我只想在一些非常原始的情况下使用它。您的示例似乎不是有效的C。您是否能够解析它?不需要@RadLexus,解析的代码将是有效的。您是指第一个示例中缺少的分号吗?如果您的行以分号结尾,则表示它不是函数声明,对吗?您应该知道,任何通用解决方案都需要连接在预处理器和解析器之间(或者必须是一个完整的预处理器本身)。@collapsar我知道,我只想在一些非常原始的情况下使用它。您的示例似乎不是有效的C。您是否能够解析它?不需要@RadLexus,解析的代码将是有效的。您是指第一个示例中缺少的分号吗?