【发布时间】:2016-04-22 07:26:38
【问题描述】:
我正在开发一个高级搜索功能,我需要评估的表达式看起来像这样,带有括号:
((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).
如果我们看括号,必须先计算条件 1 和条件 2,然后使用条件 3 执行 this 的输出,依此类推......
我们有 API 可以一次评估两个条件。然而,在这种情况下的挑战是
1) 如何识别相应的括号并首先对其进行评估。然后用这个中间结果做进一步的评估?
2)如何找到未使用的括号?例如 (((condition1 And condition2))),在这种情况下,虽然它不是必需的,但有 3 个开始和 3 个结束括号,这是一个有效的表达式。
但是,这需要基于令牌的操作,一次读取一个字符,并且它是计算机理解的算术表达式评估。在我的情况下,这些东西是定制的,我们应该找到一个算法来做到这一点。任何人都可以为我的方案提出更好的方法吗?
【问题讨论】:
-
我会将表达式树与您的 api 一起使用(如果您不想自己创建表达式树,也可以使用 linqkit,尽管它们看起来相当简单)
-
您的表达式需要一个解析器。下面是如何构建一个:stackoverflow.com/questions/2245962/… 那篇文章将向您展示如何构建树以允许以后进行评估,或者如何在解析表达式时对其进行评估。
-
分流码算法允许您将中缀表示法转换为后缀表示法,其中“内部”运算符简单地位于“外部”运算符之前。您可以像那些文章那样评估结果,但您也可以将其转换为 AST,或您的 API 需要的任何格式。那么...您的 API 需要什么格式?
标签: c# regex algorithm parsing expression