如何在C#中计算自定义括号表达式?

如何在C#中计算自定义括号表达式?,c#,regex,algorithm,parsing,expression,C#,Regex,Algorithm,Parsing,Expression,我正在开发一个高级搜索功能,其中我需要计算的表达式与括号中的内容类似: ((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) 或者

我正在开发一个高级搜索功能,其中我需要计算的表达式与括号中的内容类似:

((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执行其输出,依此类推

我们有API一次评估两个条件。然而,这方面的挑战是

1) 如何识别相应的括号并首先对其求值。然后使用这个中间结果进行进一步评估

2) 如何查找未使用的括号?例如(((条件1和条件2)),在这种情况下,虽然不是必需的,但有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
,但它演示了逻辑

希望这有帮助


注意。

我会将表达式树与您的api一起使用(如果您不想自己创建表达式树,尽管它们看起来相当简单,也可以使用linqkit),您需要一个表达式解析器。下面是如何构建一个表达式:这篇文章介绍了其他一些方法,它们将向您展示如何构建树以允许以后进行计算,或者如何在解析表达式时对表达式进行计算。分流码算法允许您将中缀表示法转换为后缀表示法,其中“内部”运算符位于“外部”运算符之前。您可以像这些文章一样评估结果,但也可以将其转换为AST或API所需的任何格式。所以您的API需要什么格式?我认为正则表达式不是为解析语法递归表达式而设计的。例如,可以(部分)选择字符串,但不进行任何计算,传递错误…@JacekCz我同意(在某种程度上,我经常使用regex进行简单的计算任务)。我在这里提出的解决方案不使用regex进行评估。它只标识需要求值的部分。谢谢Clas,这为我奠定了基础。@ClasG,在上述情况下,如果中间条件求值的输出返回一个复杂的对象而不是字符串,该怎么办?您提到我们有API一次求值两个条件,我猜您发送给it部门的信息类似于贷款编号为1000,锁定日期小于2015年3月12日,但输出是什么?我假设这就是您所谈论的复杂对象——那么您的API进程
[complex object]或借款人SSN是否包含12345