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 に答える