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

时间:2016-05-19 10:51:52

标签: c# regex string algorithm validation

我正在使用C#在字符串表达式中进行括号位置验证。表达式如下所示。

"Loan no = 12345 AND Borrower First Name Contains Milena OR Buy Side Lock Date = 03/13/2016 AND Last Finished Milestone = Decisioned OR Subject Property State = NC AND Loan Amt > 50000"

这里'AND'和'OR'是可以在两个条件之间执行的两种不同操作。我们在C#中使用API​​来评估包含操作的两个条件。

有了这些东西,最终用户可以在两个或多个条件之间放置来自UI的括号,以便优先评估这些条件。但是,UI允许他们仅在条件的开头或结尾放置括号。

让我们说在上面的例子中,如果用户想要优先考虑第二和第三个条件,他/她将括号放在它们之间,如下所示。

Loan no = 12345 AND (Borrower First Name Contains Milena OR Buy Side Lock Date = 03/13/2016) AND Last Finished Milestone = Decisioned OR Subject Property State = NC AND Loan Amt > 50000.

然而,最终用户可以根据需要添加尽可能多的括号。现在在上面的表达式中,如果用户试图将括号放在第一个和第二个条件之间,则在第二个和第三个条件之间放置括号,逻辑就会断开,因为第二个和第三个条件已经在括号中,需要首先进行求值。在这种情况下,我想阻止用户将括号放在第一和第二个条件之间。

我检查了网上的一些文章,这有助于我确定左括号的数量等于右括号的数量。然而,这无助于我找出上述问题。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:1)

如果您只是检查括号嵌套是否正确,那么您可以执行以下操作:

public static bool ParenthesisAreValid(this string str)
{
     if (string.IsNullOrEmpty(str))
         return true;

     var openParenthesis = 0;

     foreach (var c in str)
     {
         if (c == '(')
         {
             openParenthesis++;
         }
         else if (c == ')')
         {
             openParenthesis--;
         }

         if (openParenthesis < 0)
            return false;
     }

     return openParenthesis == 0;
}

这样做只是扫描整个字符串,跟踪到目前为止它遇到了多少个开括号表达式。每个左括号都会递增计数,每个右括号都会递减计数。如果计数达到-1,那么我们的括号不匹配,表达式无效。另外,如果我们完成解析字符串后,括号内的数字不等于零,那么我们就会缺少右括号,表达式也无效。

如果您只是想禁止嵌套的括号(或者当您放置它时,截取表达式),那么每当false时都会返回openParenthesis > 1

if (openParenthesis < 0 || openParenthesis > 1)
    return false;

请注意,这不会检查您的问题中未包含的其他语法规则,您可能需要考虑这些规则;以下表达式将被标记为有效,并且显然是错误的:

Condition1 (AND Condition2 OR) Condition3 AND Condition4 OR Condition5 AND Condition6