0

我正在尝试生成一个可能是这样的公式,这只是一个示例,

A + B + C > D - A

现在,A、B、C、D 等是我将在内存中访问的工作表(如 excel 工作表)的列名。

我需要生成一个规则,就像上面一样A + B + C > D - A,它将决定用户可以在单元格中添加什么样的值。

目前这就是我开始的方式:

string toValidate = "A + B + C > D + E - A";
string lhs = "", rhs = "";
string[] comparisonOperators = new string[] { "=", ">", "<", "<>", "!=" };
char[] arithmeticOperators = { '+', '-', '/', '*' };
toValidate = toValidate.Replace(@" ", "");  
for (int i = 0; i < comparisonOperators.Length; i++)
{
    if (toValidate.Contains(comparisonOperators[i]))
    {
        operatorIndex = toValidate.IndexOf(comparisonOperators[i]);
        break;
    }
}
lhs = toValidate.Substring(0, operatorIndex);
rhs = toValidate.Substring(operatorIndex + 1);
string[] columnLhsList = lhs.Split(arithmeticOperators);
string[] columnRhsList = rhs.Split(arithmeticOperators);

然而,即使我在上面的代码中有字符串lhsrhs甚至我的运算符>,我也无法理解如何在工作表本身上应用公式。我只需要知道哪个 Column 关联了哪个运算符。

因为我有单独的列名,但没有它们之前的运算符,例如,

+A -A另一种情况下之前。

我如何解析上述内容请帮忙。

4

2 回答 2

3

但是,如果您想自己制作这样的简单公式解析器,这是一个非常有趣的问题。

我建议您查看这篇文章,因为它写得非常清楚并且易于理解。

调车场算法

于 2013-07-11T10:29:54.933 回答
3

就个人而言,我永远不会尝试/敢于创建自己的公式表达式解析器。相反,我会(并且确实)使用其中一种可能可用的方法,例如CodePlex.com 上的NCalc

使用这些工具,就像写字一样简单

Expression e = new Expression("2 + 3 * 5");
Debug.Assert(17 == e.Evaluate());

评估您的公式。

通常这样的库非常可靠,经过良好测试并且具有丰富的功能集。我自己做这样一个高质量的图书馆需要很长时间(如果有的话)。

要进一步引用 NCalc 网站,您甚至可以使用变量,例如:

Expression e = new Expression("Round(Pow([Pi], 2) + Pow([Pi2], 2) + [X], 2)");

e.Parameters["Pi2"] = new Expression("Pi * [Pi]");
e.Parameters["X"] = 10;

e.EvaluateParameter += 
    delegate(string name, ParameterArgs args)
    {
        if (name == "Pi")
        args.Result = 3.14;
    };

Debug.Assert(117.07 == e.Evaluate());
于 2013-07-11T10:27:37.323 回答