基于正则表达式的数值表达式求解器

时间:2012-11-10 20:01:55

标签: c# regex math

我正在使用正则表达式创建一个简单的数值表达式求解器,现在我正在将多项式分解为它的术语。所以这就是我到目前为止所得到的:

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

当涉及负数时,这不起作用。以3 * -2 + 1为例:我得到的术语是3 *, - 2和+1,这显然是错误的 我以为我可以在标志前面看到负面的外观,以便*或/之前的标志被丢弃:

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

但这甚至不适用于正数

建议?

1 个答案:

答案 0 :(得分: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方法。正则表达式为输入添加了一些空格,然后替换了除法和模数符号。