((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#中执行此操作所需的逻辑。
答案 0 :(得分:2)
我的第一个想法太复杂而且无效。这个更简单,我希望能工作。我们只检查是否有外括号覆盖当前对,即当我们找到(...)
时,我们检查'('
之前是否有开括号并且')'
之后关闭一个括号。我们还需要在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());
}
如你所见,我认为表达式没有错误(缺少parantheses)。
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);