2012-11-10 64 views
2

我正在使用正則表達式來製作一個簡單的數值表達式求解器,現在我正在將多項式分解成它的術語。所以這是我到目前爲止:基於正則表達式的數值表達式求解器

(.*?)([\+-](.*?))+ 

當負數涉及時,這不起作用。以3 * -2 + 1爲例:我得到的術語是3 *,-2和+1,這顯然是錯誤的。
我想我可以用符號之前身後負的樣子就完事,這樣的標誌前面加*或/被丟棄:

(.*?)((?<![\*/])[\+-](.*?))+ 

但是,這並不甚至正數

建議工作?

+3

我不認爲這個正則表達式特別適合解析這樣的表達式。爲什麼不寫你自己的解析器? – Oded

+0

@Oded:我已經這樣做了,但我的一位朋友建議可以使用正則表達式,所以我正在嘗試他的方法;) – BlackBear

+0

http://regex.info/blog/2006-09 -15/247 – Oded

回答

3

希望你沒有花很多時間建立自己的解析器)

我使用此代碼來計算表達式:

class Program 
{ 
    public static double Evaluate(string expression) 
    { 
     using (var stringReader = new StringReader("<dummy/>")) 
     { 
      var navigator = new XPathDocument(stringReader).CreateNavigator(); 
      expression = Regex.Replace(expression, @"([\+\-\*])", " ${1} "); // add some space 
      expression = expression.Replace("/", " div ").Replace("%", " mod "); 
      return (double)navigator.Evaluate(string.Format("number({0})", expression)); 
     } 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine(Evaluate("3*-2+1")); 
    } 
} 

將輸出:-5

它是基於在XPathNavigator.Evaluate方法。正則表達式爲輸入添加了一些空格,然後替換了除法和模數符號。

+0

真棒方法,謝謝!但這並不是我正在尋找的。這個求解器將成爲考試的一種論題,所以我不被允許像這樣「作弊」:)但是,你的答案是驚人的! – BlackBear