2016-08-14 118 views
0

我正在寫一個使用正則表達式的自定義分析器,但我無法弄清楚如何匹配函數。Java正則表達式 - 匹配參數列表

在我的自定義語言功能的一個例子是:

function int add(int num1, int num2){ 
    return num1 + num2; 
} 

我的分詞器使用正則表達式來獲取下一個令牌,並從早期提供的源代碼字符串中刪除它。這意味着在解析函數時,我可以確定代碼將以函數語句開頭。 我現在有以下表現:

^([\s]*function[\s]+[a-zA-Z][a-zA-Z0-9]*[\s]+[a-zA-Z][a-zA-Z0-9]*[\s]*\(([\s]*[a-zA-Z][a-zA-Z0-9]*[\s]+[a-zA-Z][a-zA-Z0-9]*[\s]*)*\)[\s]*\{.*\}.*)$ 

這是很長,但它成功地這兩個功能相匹配:

function void log(string msg){ 
    Console.log(msg); 
} 

function int add(int num1 int num2){ 
    return num1 + num2; 
} 

我希望能夠分裂用逗號表示參數。

  • 我可以做一個參數後所需的逗號,但隨後的最後 參數應該用逗號結束。

  • 我可以做的逗號可選參數後,但隨後用戶將能夠不把逗號英寸

我需要能夠只需要參數之間的逗號,否則它會在稍後搞亂我的解析器。 如何編輯我的表達式以查找參數之間的逗號?

非常感謝您的時間。

+0

你能準確的告訴我你想在哪個函數中添加逗號。 –

+0

忘記它。您可以使用正則表達式將單個令牌拉出字符串,但我甚至不會嘗試使用正則表達式分析整個結構。首先,無法使用正則表達式來分析可變數量的參數並提取所有信息。 – ajb

+0

我只想匹配'(int num1,int num2)'。這只是'\(([\ s] * [a-zA-Z] [a-zA-Z0-9] * [\ s] + [a-zA-Z] [a-zA-Z0-9] * [\ S *)* \)'。我需要檢查參數是否用逗號分隔。 –

回答

1

此正則表達式應該爲字符串的(int num1, int num2)部分工作:

(\((?:\s*[^\s,]+\s+[^\s,]+\s*,)*\s*[^\s,]+\s+[^\s,]+\s*\)) 

它更容易閱讀,當你的空間吧:

(\(
(?:  \s* 
    [^\s,]+\s+ 
    [^\s,]+\s*, 
)*  \s* 
    [^\s,]+\s+ 
    [^\s,]+\s* 
\)) 
0

你可以把它看作是具有3種不同的可能性:零參數,一個參數和多個參數。然後檢查使用或運算符爲每個不同的可能性。

一個參數:

(?:\\w+\\s+\\w+) 

多於一個的參數:

(?:\\w+\\s+\\w+)(?:\\,\\s+(?:\\w+\\s+\\w+))+ 

零參數:

\\s* 

當使用或聲明(所有上述的):

((?:\\w+\\s+\\w+)|(?:\\w+\\s+\\w+)(?:\\,\\s+(?:\\w+\\s+\\w+))+|\\s*)