-1

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

4

1 回答 1

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());
}

如您所见,我假设表达式没有错误(缺少括号)。

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

没问题,不客气!

于 2013-09-19T00:34:15.720 回答