0

1+2+3 などの足し算のみで数式を取得し、その結果を返したい。私は次のコードを持っていますが、問題は double を処理しないことです (2.2+3.4 を書くことはできません([\+-]?\d+.\d+)([\+-])(-?(\d+.\d+)))。double と integer を処理するための正しい正規表現は何ですか? コードに感謝します:

        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

コメントが述べているように、正規表現はこの問題の良い解決策ではありません。+単純なsplitステートメント( and-演算子のみをサポートする場合)または実際のパーサー(実際の数式をサポートする場合)のいずれかを使用する方がはるかに良いでしょう。

ただし、一部の正規表現を説明するために、問題は\d+.\d+「1つ以上の数字、その後に任意の文字、その後に1つ以上の数字」が一致することです。99より大きい整数を指定すると、一致する.(任意の文字)が一致し、一致しない\.(具体的にはドット文字)ため、機能します。

より単純なバージョンは[\d\.]+、1つ以上の数字またはドットに一致するです。問題は、複数のドットが許可されるため8.8.8.8、有効な一致であるということです。したがって、本当に必要なのは\d+\.?\d*、1桁以上、1ドット以上のドット、および0桁以上の数字に一致するです。したがって、、、2および2.2.05すべて有効な一致です。

于 2012-08-14T17:21:04.073 に答える