Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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
C++ 是否有一个纯正则表达式,在给定一个函数名的情况下,它会在C/C+中捕获具有该名称的函数体+;?_C++_Regex - Fatal编程技术网

C++ 是否有一个纯正则表达式,在给定一个函数名的情况下,它会在C/C+中捕获具有该名称的函数体+;?

C++ 是否有一个纯正则表达式,在给定一个函数名的情况下,它会在C/C+中捕获具有该名称的函数体+;?,c++,regex,C++,Regex,让我们假设我们正在字符串或文件中查找foo的函数体。捕获签名很容易 但是,有一个正则表达式可以捕获函数体。我们不对该功能的内部结构进行任何假设 它可以是扁平的,比如: int foo() { return i; } 或者像这样分层的东西: void foo() { if(true) { for (int i=0; i<5; i++ ) { cout<< i << std::endl;

让我们假设我们正在字符串或文件中查找foo的函数体。捕获签名很容易

但是,有一个正则表达式可以捕获函数体。我们不对该功能的内部结构进行任何假设

它可以是扁平的,比如:

int foo()
{
    return i; 
}
或者像这样分层的东西:

void foo()
{
    if(true)
    {
       for (int i=0; i<5; i++ )
       {
           cout<< i << std::endl;
       }
    }  
}
void foo()
{
如果(真)
{

for(inti=0;iRegex不能这样做()

简单的反例:正则表达式不能解析任意嵌套的东西(参见链接),并且

演示可以将函数嵌套在任意深度的函数中

不,由于注释、字符串/字符文本和预处理器的原因,匹配大括号和大括号(除了是regex不能做的另一件事)是不够的。例如:

#define EVIL {

void foo()
{
  if (someCondition)
  EVIL

    // Closing } is inside the ifdef (and we have another one in this comment).
#ifdef SOME_DEFINE
    doStuff1("I like strings with unmatched braces }");
  } // Who likes trigraphs ??/
  doStuff2();
#else
    doStuff3();
  }
#endif
}
是的,祝你好运


一般来说,C++是很难解析的,我建议使用一个为该工作而建的工具,比如<代码> CLAN/<代码> .< /P>你可以看一下<代码> CTAGS < /C>或<代码> GNGlobal < /Cord>?不,没有办法。编译器前端是解析器的好例子。e解析C++语法,尤其是函数体。如果得到正确的答案大部分时间都是足够好的,那么只需计数<代码> {<代码> >和代码> } /COD>注意避免注释、字符串和字符文字中的出现。不完美,但可能是足够好的。@约翰和预处理器禁用的部分,以及(先前)算上三角图,还有…祝你好运。
#define EVIL {

void foo()
{
  if (someCondition)
  EVIL

    // Closing } is inside the ifdef (and we have another one in this comment).
#ifdef SOME_DEFINE
    doStuff1("I like strings with unmatched braces }");
  } // Who likes trigraphs ??/
  doStuff2();
#else
    doStuff3();
  }
#endif
}