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