2011-06-18 158 views
2

我有以下表達式:正則表達式模式匹配一​​個數學表達式

"3 + 2 * ((1 + 1 - (2 + 4))) + 112 * 31 - ((1+1) - 14 + 1)" 

我想與頂層parentesis

例如分割表達式:

String Expression = "3 + 2 * ((1 + 1 - (2 + 4))) + 112 * 31 - ((1+1) - 14 + 1)"; 
String[] result = Regex.Split(expression, "??"); 

預期輸出:

//result[0] = 3 + 2 * 
//result[1] = (1 + 1 - (2 + 4)) 
//result[2] = + 112 * 31 - 
//result[3] = 3 + 2 * 
//result[4] = (1+1) - 14 + 1 
+7

你最好爲此編寫一個解析器(或者,最好的,只搜索一個 - 有一個好的已經在那裏)。算術就像html - 不是_regular_。 –

+0

什麼是「休閒表達」?它只是一個錯字,或者這是某種符號? –

+0

我同意Joel的觀點,但如果你真的想在正則表達式中做到這一點(如果你正在尋找一個挑戰和/或你恨自己) - 你可能會對.NET的平衡模式匹配感興趣。但正如Joel所說,Lexer/Parser是更好的選擇。 – vcsjones

回答

3

這通常不是正則表達式的工作。但是,這個msdn blog article表明它可能在.net版本中使用名爲「平衡匹配」的擴展名。

不是一個C#開發人員,我不認爲我可以完成回答,但也許這會有所幫助。

雖然您可能會更好地查找或編寫實際的解析器。

0

嘗試用正則表達式:

([^*]+\*)\s*\x28(.+?)\x29\s+([^-]+\-)(.+?) 

-

string a = "3 + 2 * ((1 + 1 - (2 + 4))) + 112 * 31 - ((1+1) - 14 + 1)"; 
       Match match = Regex.Match(a, @"([^*]+\*)\s*\x28(.+?)\x29\s+([^-]+\-)(.+?)"); 
       for (int c = 0, len = match.Length; c < len; c++) 
       { 
        Console.WriteLine(match.Groups[c].Value); 
       } 

好了,我的這個分析沒有任何更好的主意。

3

此正則表達式你想要做什麼,因爲你使用的是.NET。它使用.NET獨有的稱爲平衡組的特性。

^[^(]*(?=\()|(?<=\()(?>[^()]+|\((?<depth>)|\)(?<-depth>))*(?(depth)(?!))(?=\))|(?(depth)|[^\(\)]+) 

下面的代碼:

string expression = "3 + 2 * ((1 + 1 - (2 + 4))) + 112 * 31 - ((1+1) - 14 + 1)"; 
string pattern = @"^[^(]*(?=\()|(?<=\()(?>[^()]+|\((?<depth>)|\)(?<-depth>))*(?(depth)(?!))(?=\))|(?(depth)|[^\(\)]+)"; 
MatchCollection results = Regex.Matches(expression,pattern); 

結果填充結果陣列以下值:

//results[0] = 3 + 2 * 
//results[1] = (1 + 1 - (2 + 4)) 
//results[2] = + 112 * 31 - 
//results[3] = (1+1) - 14 + 1 

這裏有一個相關的博客文章平衡組:http://blog.stevenlevithan.com/archives/balancing-groups