从表达式中删除重复的括号

时间:2013-09-19 00:02:38

标签: c# string

((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#中执行此操作所需的逻辑。

1 个答案:

答案 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);

no problem, you're welcome!