2016-07-20 5 views
1

指定された文字列の中から内側に括弧を入れて値を取りたい。だから、もし私の弦に括弧があるならば、まず括弧の中で一番深いところに到達しなければならない。後に、私は後の括弧を取る必要がありますどのように前の文字列を組み合わせる。そして、私は文字列に沿ってこれらのプロセスを行う必要があります。Cの中に別々のネストしたカッコ#

例入力:

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

出力:

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

、それはいくつかのアルゴリズムとおそらく1つ以上のスタックが必要です:) – user3185569

+0

私は正規表現で簡単に私ができないと思った正規表現のaster。分割方法でこの問題を解決できますか? –

答えて

2

ここでは、簡単なスタック実装です。パースこのような問題のために良いものではありません正規表現:

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

印刷アウト:これは正規表現で行うことを意図していない

// 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

上記の質問に対する回答に興奮しています......... +1 – andy

+0

そのコードは私の問題を解決しました。ご協力いただきありがとうございます。 –

関連する問題