2011-10-06 104 views
4

我正在構建一個應用程序,用戶可以在其中指定一些表達式的某些字段。該表達式也應包含函數。我需要評估這些表達式並在報告中顯示最終值。正則表達式來提取函數名稱,它的參數

我有一個表達式來提取函數名稱&它是參數。以前,函數參數是十進制值。但是現在,參數也可以表達。

對於離,

Round(1 * (1+ 1 /100) % (2 -1), 0) 

Function-name : Round 
Parameter1 : 1 * (1+ 1 /100) % (2 -1) 
Parameter2 : 0 

上正則表達式:

string pattern2 = @"([a-zA-Z]{1,})[[:blank:]]{0,}\(([^\(\)]{0,})\)"; 

此正則表達式不幫我再找到表達參數。

有人可以幫我用正確的正則表達式來提取函數名稱&參數嗎?我實現了Math類所支持的全部或大部分功能。該程序是建立在C#

在此先感謝您的幫助。

+5

表達與功能都沒有正規的語言,所以你不能假設能夠用正則表達式解析它們。 – Gabe

回答

2
"^\s*(\w+)\s*\((.*)\)" 

組(1)是函數名

分割組(2)","你對列表。

更新

,因爲我沒有Windows系統(.NET要麼),我與Python測試。嵌套函數不是問題。如果我們加上「^ \ S *」在表達式的開頭:

import re 

s="Round(floor(1300 + 0.234 - 1.765), 1)" 
m=re.match("^\s*(\w+)\s*\((.*)\)",s) 
m.group(1) 
Output: 'Round' 

m.group(2) 
Output: 'floor(1300 + 0.234 - 1.765), 1' 
you can split if you like: 
m.group(2).split(',')[0] 
Out: 'floor(1300 + 0.234 - 1.765)' 

m.group(2).split(',')[1]                           
Out: ' 1' 

好,如果你的函數嵌套就像f(a(b,c(x,y)),foo, m(j,k(n,o(i,u)))),我的代碼將無法正常工作。

+0

這不起作用。以「Round(1)+ Round(2)」爲例。 –

+0

好吧,我認爲這將是每行只有一個函數,如示例所示。 – Kent

+0

表達式也可以有嵌套函數。對於前輪(樓層(1300 + 0.234 - 1.765),1) –

1

您可以嘗試編寫解析器,而不是使用正則表達式。
Irony庫(在我看來)非常易於使用,並且在示例中有一些與您正在嘗試執行的操作非常相似。

0

從後Regex for matching Functions and Capturing their Arguments,您可以使用正則表達式肯特提取您的功能,使用此代碼以提取參數形成最後一組:

string extractArgsRegex = @"(?:[^,()]+((?:\((?>[^()]+|\((?<open>)|\)(?<-open>))*\)))*)+"; 
var ArgsList = Regex.Matches(m.Groups[m.Groups.Count - 1].Value, extractArgsRegex);