2016-02-10 37 views
0

我想從一個源代碼文件逐一檢索所有的函數定義。最終,我想只檢索所有函數名稱。源文件有以下幾種形式:匹配(基本)函數聲明

#include bla 

first_function_name() 
{ 
} 

second_function_name(first_parameter, second_parameter) 
{ 
    i = 0; 
} 

注意,沒有訪問修飾符和返回類型,這是解析Java編程語言。

我想通過regular expression實施解決方案。到目前爲止,我設法匹配函數定義,但是我遇到的問題是,正則表達式不僅僅匹配單個函數,而且還有後來的函數。基本上,它不會在右大括號處結束。我嘗試使用$符號,但它也沒有結束正則表達式。

正則表達式我目前使用的是這樣的:

private static final String FUNCTION_NAME_MATCHER = "[a-zA-Z]\\w*"; 
private static final String FUNCTION_MATCHER = "(?s)" + FUNCTION_NAME_MATCHER + "[(].*[)].*[\\{]([^\\}]*)?[\\}]"; 

如何阻止它從符合以下功能的呢?對於上面的示例函數,它應該匹配兩次,但它只匹配一次(同時包含兩個函數定義)。

用於獲取匹配函數定義列表的方法是這樣的:

public List<String> getMatches() 
{ 
    List<String> matchedResults = new ArrayList<>(); 
    Matcher matcher = Pattern.compile(FUNCTION_MATCHER).matcher(sourceFile); 

    while (matcher.find()) 
    { 
     String functionDefinition = matcher.group(); 
     String functionName = functionDefinition.split(FUNCTION_NAME_MATCHER)[0]; 
     matchedResults.add(functionName); 
    } 

    return matchedResults; 
} 
+1

你有語言的語法?然後你可以使用[Java編譯器編譯器](https://javacc.java.net/)。 –

+0

@AndyTurner: 不是真的,但它是一個基本的腳本語言,沒有什麼太平凡。它基於C – BullyWiiPlaza

回答

1

試試這個

private static final String FUNCTION_NAME_MATCHER = "([a-zA-Z]\\w*)"; 
private static final String FUNCTION_MATCHER = "(?s)" + FUNCTION_NAME_MATCHER + "\\([^)]*\\)\\s*\\{[^}]*\\}"; 

public static List<String> getMatches() 
{ 
    List<String> matchedResults = new ArrayList<>(); 
    Matcher matcher = Pattern.compile(FUNCTION_MATCHER).matcher(sourceFile); 

    while (matcher.find()) 
    { 
     matchedResults.add(matcher.group(1)); 
    } 

    return matchedResults; 
} 
1

*是貪婪的,它會選擇每一個可能匹配的字符,它可以找到。眼下[(].*[)]部分被消耗一切都在第一個函數在從第一個(一路到最後)。你想讓它不願意,如果需要的話,它只會消耗一個角色。通過改變所有.*.*?

此外,你可能想匹配函數聲明和身體之間只有空白這樣做,所以你應該[)]\\s*[\\{]

取代[)].*[\\{]如果封閉FUNCTION_NAME_MATCHER(參數和)它將被捕獲到一個捕獲組中,以便您可以提取它。

1

首先,你要匹配的整體功能,避免匹配函數調用&重複:

[^\s]*\(([^}]*)\)\{([^}]*)} 

然後,你要拆分這件事得到名稱:

String matchedName = matchedFunction.split("(")[0] 

你去了!這一切都完成了,並且拂去灰塵!