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;
    }
4

1 回答 1

0

正如评论所说,RegEx不是解决这个问题的好方法。使用简单的拆分语句(如果您只想支持+and-运算符)或实际的解析器(如果您想支持实际的数学表达式)会好得多。

但是,为了解释一些正则表达式,您的问题是\d+.\d+匹配“一个或多个数字,后跟任何字符,后跟一个或多个数字”。如果你给它一个大于 99 的整数,它会起作用,因为你匹配的是.(任何​​字符)而不是\.(特别是点字符)。

一个更简单的版本是[\d\.]+,它匹配一个或多个数字或点。问题是它允许多个点,所以8.8.8.8是一个有效的匹配。所以你真正想要的是\d+\.?\d*,它匹配一个或多个数字、一个或零个点和零个或多个数字。因此2,2.2.05都是有效匹配。

于 2012-08-14T17:21:04.073 回答