2016-08-26 70 views
-1

我需要找到一個鏈通話功能發生查找函數的參數逗號,但必須包括哪裏有不止一個參數傳遞的(以Java編程)的情況下:使用正則表達式

Tower.getType(I,J).initialPrice(F,G);

Tower.getType()。initialPrice();

到目前爲止,只有設法使正則表達式時,只有一個參數或沒有一個:[]

[\ w] +(+ [\ w] + [(] + [\ w ] * + [)]){2,} + [;]

喜歡:

Tower.getType()initialPrice(); ();函數3()。函數3()。函數4()。函數5();函數3()函數3。

我想這一點,但它不工作:

[\ w] +([\。] + [\ w] + [(] + [\ w] * +([\] + [\ W])* + [)]){2,} + [;]

我的代碼:

public static void checksMessageChain (String s) {   
if (s!=null && s.matches("[\\w]+([\\.]+[\\w]+[(]+[\\w]*+[)]){2,}+[;]")) { 
    System.out.println("\nIts Message Chain for "+s+"\n"); 
    splitMessageChain(s); // {0,} equivale a * 
} else if (s!=null && s.matches("[\\w] + ([\\.] + [\\w] + [(] + [\\w]* + ([\\,] + [\\w])* + [)]) {2,} + [;]")) { 
    System.out.println("\nIts Message Chain for "+s+"\n"); 
    splitMessageChain(s); 
} else { 
    System.out.println("\nIts not Message Chain for "+s+"\n"); 
} } 
+0

你可以給一些示例輸入/輸出嗎? – suiwenfeng

+2

你有一個問題,所以決定使用正則表達式 - 現在你有兩個問題... – Alnitak

回答

0

我不會與指定參數麻煩,只是使用:

\\w+(?:\\.\\w+\\([^)]*\\)){2,}; 

請注意,如果一個String參數包含右括號並且它不處理多行表達式,則這將失敗。
對於這樣一種複雜的語言,通常情況下,你最好使用專門的解析器。我從來沒有使用過,但快速搜索顯示在Github上有javaparser

你可以試試regex101

+0

我使用AST解析器,但在此之後,我需要檢查函數的消息鏈或不... ...和regex101它非常有用!謝謝! –

+0

等等,你需要至少兩個方法調用鏈接,對不對?我忘了考慮這一點,我已經更新了我的正則表達式和regex101測試。不客氣! – Aaron

+0

感謝您的幫助! (: –

0

不要試圖使用正則表達式來做到這一點:你會頭痛,一個程序不會涵蓋所有可能的情況。

只需使用JavaParser:它是開源的,它是輕量級的,它沒有依賴關係。

您可以解析整個Java文件,然後導航抽象語法樹來查找函數調用,也可以直接解析您感興趣的單個表達式,如果您已經確定了那段源代碼。

在你要調用parse第一種情況,否則parseExpression

一旦你的MethodCallExpr如果其父是另一個MethodCallExpr那麼你已經鏈式調用。

聲明:我是JavaParser的貢獻者