Моя первая идея была слишком сложной и не работала. Это проще, и я надеюсь, что это сработает. Мы просто проверяем, есть ли внешние скобки, охватывающие текущую пару, т. Е. Когда мы нашли (...)
, мы проверяем, есть ли открытые круглые скобки до '('
и закрытие одного после ')'
. Также нам нужно удалить их, когда 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);
кто может помочь мне, что будет логика или алго будет необходимо для достижения этой задачи? –
Я предполагаю, что вы хотите обрезать посторонние парады изнутри, правильно? Пример: '(f1 = 2) AND ((f2 = 3)' -> '(f1 = 2) AND (f2 = 3)' – Carter
Какая разница между 2-й и 3-й строками в примере? – pkuderov