2013-09-19 3 views
-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#.

+0

кто может помочь мне, что будет логика или алго будет необходимо для достижения этой задачи? –

+0

Я предполагаю, что вы хотите обрезать посторонние парады изнутри, правильно? Пример: '(f1 = 2) AND ((f2 = 3)' -> '(f1 = 2) AND (f2 = 3)' – Carter

+2

Какая разница между 2-й и 3-й строками в примере? – pkuderov

ответ

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

no problem, you're welcome!

+0

Я получил, что первая версия была неправильной и изменила ее – pkuderov

+0

Строки неизменяемы, 's.Replace (toRemove.ToString()," ");' не изменяет значение 's' ... * immutable * также означает, что индекс для' string.this [int] 'доступен только для чтения и не может быть назначен таким образом - ваш код doesn ' t компилировать как есть;) –

+0

О, да, забыл об этом. UPD. как насчет этого? – pkuderov

Смежные вопросы