2012-04-25 22 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); 
}