一尘不染

如何在C#中评估自定义括号表达式?

algorithm

我正在使用“高级搜索”功能,在需要加上括号的情况下,我需要评估的表达式看起来像这样:

((Loan number is 1000 And
Lock Date is less than 12/03/2015) Or
Borrower SSN contains 12345) And
((Buy date is between 12/01/2015 and 23/02/2016 And
APR is less than 20000) Or
Loan amount is greater than 60000)

或者用简单的话

((condition1 And condition2) Or condition 3) And ((condition4 And condition5) Or condition6).

如果我们看一下括号,则必须先对condition1和condition2求值,然后使用条件3执行其输出,依此类推…。

我们有API可以一次评估两个条件。然而,在这种情况下的挑战是

1)如何识别相应的括号并首先对其进行评估。然后将此中间结果用于进一步评估?

2)如何找到未使用的括号?例如((((condition1 And
condition2))))在这种情况下尽管不是必须的,但有3个开始括号和3个结束括号是有效的表达式。

我试图在这里这里找到一些算法

但是,这需要基于令牌的操作,该操作一次读取一个字符,这是计算机可以理解的算术表达式评估。就我而言,这些都是自定义的,我们应该找到一种算法来做到这一点。谁能为我的方案建议一个更好的方法?


阅读 234

收藏
2020-07-28

共1个答案

一尘不染

如果我对您的理解正确,那么您已经有了表达式评估器。您需要的是根据括号拆分评估。我将使用一个循环,使用此正则表达式在其中找到内部括号组:

\(([^()]*)\)

然后,如果找到了它们,请用您的评估例程的结果替换它们,并重复直到最后一个字符串保留而没有括号。

伪代码:

Find a string enclosed by (), not containing any ()
If found
    Replace it with the evaluated value of the string (including parenthesis)
    Go again
Return result

关于 未使用的 括号,将其视为相同。它们最终将作为单个值出现在您的评估例程中。

检查这个小提琴。而不是求值,它返回一个随机数01,但是它演示了逻辑。

希望这可以帮助。

问候。

2020-07-28