2012-04-25 24 views
1

我试图解析输出cflow,然后将用它来构建控制流的3D图。 cflow的的输出看起来是这样的:获取正确的正则表达式 - Java

main() <int main (int argc, char *argv[]) at sort.c:3>: 
    strcmp() 
    printf() 
    malloc() 
    getline() <char *getline (int max) at sort.c:62>: 
     isspace() 
     getchar() 
     ungetc() 
     malloc() 
    qsort() 
    free() 

我使用正则表达式来提取函数名和括号 - 我想main()strcmp(),等我的代码如下:

String line = input.nextLine(); // input is a Scanner reading from a file 
Pattern p = Pattern.compile("[a-zA-Z0-9_]+\\(\\)"); // the important part 
Matcher m = p.matcher(line); 

现在,我正在使用的模式使用Emacs的正则​​表达式构建器模式。但是当我运行这个程序时,我没有得到任何匹配。我可能只是不了解Java的正则表达式函数。

另外,我意识到显而易见的解决方案是不使用Java ...我更喜欢这个,但是我要用Processing来绘制图形,所以我没有真正的选择。

+0

我只是算前导空格,以确定树有多深,剥去前导空格函数名,参数括号后砍东西。 – 2012-04-25 18:04:58

+0

我意识到我可以用普通的字符串处理来完成它,但是用正则表达式来处理它似乎更优雅。正如第十一医生可能会说的那样,正则表达式是_cool_。 – Peter 2012-04-25 18:10:00

+1

你打算如何获得比赛?什么匹配方法? – 2012-04-25 18:10:10

回答

1

如果您尝试提取部分字符串,则必须使用括号在正则表达式中形成组。如果您将正则表达式重写为.*([a-zA-Z0-9_]+\\(\\)).*之类的内容,则实际上将括号中的组存储为匹配项。然后,您将调用m.group(1)来检索由第一个括号组提取的字符串,即[a-zA-Z0-9_]+\\(\\)

0

根据您当前的语法和m.matches(),爪哇假定你的意思是:

Pattern p = Pattern.compile("^[a-zA-Z0-9_]+\\(\\)$"); 

所以,你需要添加通配符表达式的开始和结束(我包你想在相匹配的部分括号)

Pattern p = Pattern.compile(".*([a-zA-Z0-9_]+\\(\\)).*"); 

或致电m.find(),而不是m.matches()

现在,您可以拨打:

if(m.matches()) 
{ 
    myFunctionName = m.group(1); 
}