如何在C#中评估自定义括号表达式?
我正在开发一个高级搜索function,其中我需要评估的表达式看起来像是这样的括号:
((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个右括号,它是一个有效的表达式。
我试着在这里和这里找到一些算法
然而,这需要基于令牌的操作,该操作一次读取一个字符,并且它是计算机理解的算术表达式评估。 在我的情况下,这些东西是自定义的,我们应该找到一个算法来做到这一点。 任何人都可以为我的场景建议更好的方法吗?
如果我理解正确,你已经有了表达式评估器。 您需要的是根据括号分割评估。 我使用一个循环,我在其中找到内括号组,使用此正则表达式:
\(([^()]*)\)
然后,如果找到,则将其替换为评估例程的结果,并重复直到最后一个字符串保留,不带括号。
伪代码:
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
关于未使用的括号,让它们处理相同。 它们最终会作为单个值进入您的评估例程。
检查这个小提琴 。 而不是评估它返回一个随机数, 0
或1
,但它certificate了逻辑。
希望这可以帮助。
问候。