我正在使用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.
然而,最终用户可以根据需要添加尽可能多的括号。现在在上面的表达式中,如果用户试图将括号放在第一个和第二个条件之间,则在第二个和第三个条件之间放置括号,逻辑就会断开,因为第二个和第三个条件已经在括号中,需要首先进行求值。在这种情况下,我想阻止用户将括号放在第一和第二个条件之间。
我检查了网上的一些文章,这有助于我确定左括号的数量等于右括号的数量。然而,这无助于我找出上述问题。
有人有任何建议吗?
答案 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