2012-08-14 113 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都是有效的匹配。