2016-07-20 10 views
1

Ich möchte Werte von innen nach außen Klammern in gegebenen Zeichenfolge nehmen. Also, wenn es Klammern in meiner Zeichenfolge gibt, muss ich zuerst die tiefsten Klammern erreichen. Danach muss ich später Klammern nehmen, wie die vorherige Zeichenfolge kombiniert ist. Und ich muss diesen Prozess entlang der Zeichenfolge machen.seperate geschachtelte Klammern in C#

Beispiel Eingabe:

C1 AND [C2 OR C3 OR [C4 OR [C5 AND C6] AND C7]] OR C8 

Output:

C5 AND C6 
C4 OR [C5 AND C6] AND C7 
C2 OR C3 OR [C4 OR [C5 AND C6] AND C7] 
C1 AND [C2 OR C3 OR [C4 OR [C5 AND C6] AND C7]] OR C8 
+1

Dies ist nicht mit Regex getan werden soll, es braucht einige Algorithmen und vielleicht einen oder mehrere Stacks :) – user3185569

+0

Ich dachte, es kann leicht mit Regex gemacht werden, weil ich nicht m Aster in Regex. Löse ich dieses Problem mit Split-Methoden? –

Antwort

2

Hier ist eine einfache Stapel Umsetzung; reguläre Ausdrücke für solche Parsen Probleme sind nicht gut:

private static IEnumerable<String> Nested(string value) { 
    if (string.IsNullOrEmpty(value)) 
    yield break; // or throw exception 

    Stack<int> brackets = new Stack<int>(); 

    for (int i = 0; i < value.Length; ++i) { 
    char ch = value[i]; 

    if (ch == '[') 
     brackets.Push(i); 
    else if (ch == ']') { 
     //TODO: you may want to check if close ']' has corresponding open '[' 
     // i.e. stack has values: if (!brackets.Any()) throw ... 
     int openBracket = brackets.Pop(); 

     yield return value.Substring(openBracket + 1, i - openBracket - 1); 
    } 
    } 

    //TODO: you may want to check here if there're too many '[' 
    // i.e. stack still has values: if (brackets.Any()) throw ... 

    yield return value; 
} 

...

string source = "C1 AND [C2 OR C3 OR [C4 OR [C5 AND C6] AND C7]] OR C8"; 

var result = Nested(source); 

ausdrucken:

// C5 AND C6 
// C4 OR [C5 AND C6] AND C7 
// C2 OR C3 OR [C4 OR [C5 AND C6] AND C7] 
// C1 AND [C2 OR C3 OR [C4 OR [C5 AND C6] AND C7]] OR C8 
Console.Write(String.Join(Environment.NewLine, result)); 
+0

Ich bin aufgeregt über die Antwort für obige Frage ......... +1 – andy

+0

Dieser Code löste mein Problem. Vielen Dank für Ihre Hilfe. –

Verwandte Themen