((f1=2)AND(f2=3)) -> ((f1=2)AND(f2=3))
没变
((f1=2)AND((f2=3))) -> ((f1=2)AND(f2=3))
(((f1=2)AND(f2=3))) -> ((f1=2)AND(f2=3))
我有上面的表达式,我想从字符串中删除重复的括号。我不知道在 C# 中执行此操作所需的逻辑。
我的第一个想法太复杂了,没有奏效。这个更简单,我希望能奏效。我们只是检查是否有外括号覆盖当前对,即当我们发现时,(...)
我们检查在 之前是否有左括号,在'('
之后是否有右括号')'
。我们还需要在 时删除它们s="(.....)"
,即当我们找到从 0 开始并在末尾关闭的最外层括号时。
private string RemoveDoubleParenthesis(string initialString)
{
char[] s = new char[initialString.Length];
char toRemove = '$';
Stack<int> stack = new Stack<int>();
for (int i = 0; i < s.Length; i++)
{
s[i] = initialString[i];
if (s[i] == '(')
stack.Push(i);
else if (s[i] == ')')
{
int start = stack.Pop();
if ((start == 0 && i == (s.Length - 1))
|| (s[start-1] == '(' && s[i+1] == ')'))
{
s[start] = s[i] = toRemove;
}
}
}
return new string((from c in s where c != toRemove select c).ToArray());
}
如您所见,我假设表达式没有错误(缺少括号)。
UPD谢谢,@retailcoder。很抱歉弄乱了答案版本:)
var results = string.Join("\n", new string[]
{
"((f1=2)AND(f2=3))",
"((f1=2)AND((f2=3)))",
"(((f1=2)AND(f2=3)))",
"(f1=2 AND(f2=3))",
"((f1=2 AND (f3=4)) AND(f2=3))"
}
.Select(s => string.Format("{0} -> " + RemoveDoubleParenthesis(s), s)));
MessageBox.Show(results);