2

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

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

当涉及负数时,这不起作用。以 3*-2+1 为例:我得到的条件是 3*、-2 和 +1,这显然是错误的。
我以为我可以在符号之前以负面的眼光逃脱,以便丢弃 * 或 / 前面的符号:

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

但这甚至不适用于正数

建议?

4

1 回答 1

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方法。正则表达式在输入中添加一些空格,然后替换除法和模符号。

于 2012-11-10T20:13:11.170 回答