用于查找函数的正则表达式

时间:2016-01-27 20:46:58

标签: java c++ regex

所有C ++函数的格式为

type name ( parameters ) { … } 

要识别正则表达式,请使用

regex = "...";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(line);
if (matcher.matches())
{
    ...
}

我只能实际搜索type name (部分,因为我使用的是线阅读器,功能定义可能是多行的,而且我不确定正则表达式是什么。 .*\\b.*\\(是我最近的猜测,但它不起作用。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

不幸的是,没有可以匹配所有函数定义的通用正则表达式。

C ++语法规范允许您根据需要多次添加任何变量的名称。例如,您可以写

 int ((((((a))))));

声明一个名为a的变量。这意味着您可以定义如下函数:

void whyWouldYouDoThis(int (((((becauseICan)))))) {
   /* ... */
}

这个问题是它意味着函数声明可以具有任意复杂的括号嵌套。你可以证明,一般来说,需要跟踪平衡括号的字符串集不能与正则表达式相匹配(正式地说,这些字符串的语言不是常规的),不幸的是,这适用于此。

这绝对是非常人为的,但有些情况下你会看到很多嵌套的括号。例如,考虑这个函数:

void thisFunctionTakesACallback(void imACallbackFunction()) {
    /* ... */
}

这里,由函数参数本身是函数类型的事实引起了额外的括号层。如果 函数进行了回调,您可以看到如下内容:

void thisFunctionTakesACallback(void soDoesThisOne(void imACallbackInACallback())) {

     /* ... */
}

如果您正在寻找所有函数声明,那么最好使用解析器并为您正在寻找的内容定义语法,因为这些模式是无上下文的。您也可以考虑连接到编译器前端(例如,g ++可以在GIMPLE或GENERIC框架中为您生成AST)并使用它来提取您正在寻找的内容。这可以保证你不会错过任何东西。