2012-08-14 96 views
0

加入我想數學方程式只與另外如1 + 2 + 3,並返回其結果。我有下面的代碼,問題是,它不處理雙打(我不能寫2.2 + 3.4) 我試圖改變正則表達式爲([\+-]?\d+.\d+)([\+-])(-?(\d+.\d+)),現在它不處理整數(我不能寫2 + 4 )。什麼應該是正確的正則表達式來處理雙精度和整數?感謝名單 代碼:如何解決與正則表達式

 regEx = new Regex(@"([\+-]?\d+)([\+-])(-?(\d+))"); 
     m = regEx.Match(Expression, 0); 
     while (m.Success) 
     { 
      double result; 
      switch (m.Groups[2].Value) 
      { 
       case "+": 

        result = Convert.ToDouble(m.Groups[1].Value) + Convert.ToDouble(m.Groups[3].Value); 

        if ((result < 0) || (m.Index == 0)) Expression = regEx.Replace(Expression, DoubleToString(result), 1); 
        else Expression = regEx.Replace(Expression, "+" + result, 1); 
        m = regEx.Match(Expression); 
        continue; 
       case "-": 
        result = Convert.ToDouble(m.Groups[1].Value) - Convert.ToDouble(m.Groups[3].Value); 
        if ((result < 0) || (m.Index == 0)) Expression = regEx.Replace(Expression, DoubleToString(result), 1); 
        else Expression = regEx.Replace(Expression, "+" + result, 1); 
        m = regEx.Match(Expression); 
        continue; 
      } 
     } 
     if (Expression.StartsWith("--")) Expression = Expression.Substring(2); 
     return Expression; 
    } 
+3

,豈不是更容易使用像String.Split()?你必須堅持正則表達式嗎? – Egor 2012-08-14 16:20:52

+2

針對每個問題應用'regex'解決方案是一個非常糟糕的想法....正如葉戈爾建議的,不要使用「分割」功能! – Anirudha 2012-08-14 16:25:07

+4

如果你想嘗試編寫一些可以解析和評估許多數學表達式的東西,那麼請務必編寫一個解析器。 – nhahtdh 2012-08-14 16:26:21

回答

0

正如評論所指出的,正則表達式是很好地解決了這個問題。如果您只想支持+-運算符,或者實際的解析器(如果您想支持實際的數學表達式),那麼您將會更好。

但是,爲了解釋某些正則表達式,您的問題是\d+.\d+匹配「一個或多個數字,後跟任何字符,後跟一個或多個數字」。如果你給它一個大於99的整數,它會起作用,因爲你匹配.(任何字符),而不是\.(特別是點字符)。

一個簡單的版本將是[\d\.]+,它匹配一個或更多的數字或 - 點。問題是它允許多個點,所以8.8.8.8是有效的匹配。所以你真正想要的是\d+\.?\d*,它匹配一個或多個數字,一個或零個點和零個或多個數字。因此,2,2.2.05都是有效的匹配。