2015-08-10 10 views
6

Ich habe die folgende Zeichenfolge:Werte durch Kommas teilen, die außerhalb der Klammern stehen?

[A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D],[C],[E])), FUNCTION([C], [X]), 100 

und wollen es durch Kommata trennen, die außerhalb stehen hierfür sind:

  • [A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D],[C],[E]))
  • FUNCTION([C], [X])
  • 100

Ich war nicht in der Lage zu Tun Sie dies alleine oder verwenden Sie eine der ähnlichen Antworten hier.

Zum Beispiel ,\s*(?!\[^()\]*\)) regulären Ausdruck funktioniert gut, aber nur wenn nicht verschachtelte Klammern verwendet werden, was mein Fall ist.

Kann mir jemand sagen, wie man die Werte teilt (mit oder nicht regulären Ausdruck)?

+0

Sie haben die Bedingungen zu analysieren, entweder push/pop-Methode oder rekursive Methode. Das sieht nach einer Schulaufgabe aus. Es ist kein einfaches Problem und dauert Stunden, um eine vollständige Lösung zu erhalten. – jdweng

+0

mögliches Duplikat von [String aufteilen nach ',' in Array außer ',' innerhalb()] (http://stackoverflow.com/questions/31739853/split-string-by-into-array-except-within) – juharr

+0

@ juharr Wie ich schon sagte - diese Antworten funktionieren nicht mit verschachtelten Klammern. – gotqn

Antwort

4

Sie verwenden können, statt Spaltung passend:

(?:(?:\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\))|[^,])+ 

Siehe demo

Diesen Teil - \((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\) - passend ausgeglichene Klammer und diese - [^,] - jedes Zeichen, sondern ein Komma.

enter image description here

Siehe IDEONE demo:

var line = "[A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D],[C],[E])), FUNCTION([C], [X]), 100"; 
var matches = Regex.Matches(line, @"(?:(?:\((?>[^()]+|\((?<number>)|\)(?<-number>))*(?(number)(?!))\))|[^,])+"); 
foreach (Match m in matches) 
    Console.WriteLine(m.Value.Trim()); 

Ausgang:

[A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D],[C],[E])) 
FUNCTION([C], [X]) 
100 
+0

Sie können über sie [hier] (http://stackoverflow.com/questions/17003799/what-are-regular-expression-balancing-groups), [hier] (http://weblogs.asp.net/whaggard/377025) und [hier] (http://www.rexegg.com/regex-csharp.html#balancingGroups). Es ist nicht trivial, aber es ist ziemlich geradlinig, obwohl sieht chaotisch aus :(Die Regex ohne diesen Teil ist sehr einfach: passen Sie einfach die balancierten Klammern oder alles, was kein Komma ist. –

+0

Ist diese Lösung nur für eine bestimmte Ebene der verschachtelten Klammern und wird sicherlich mit einer anderen Ebene der Verschachtelung brechen? Es sieht aus wie es auf den ersten Blick aussieht. – klaar

+0

@klaar: Die Anzahl der Ebenen kann viele sein, wird nur durch die verfügbare Stapeltiefe beschränkt. –

-1
string s = "[A] == [B] * 10 - FUNCTION([C], STRING_EXPRESSION, FUNCTION([D], [C],[E])), FUNCTION([C], [X]), 100"; 
    List<string> splitted = new List<string>(); 
    int beginPos = 0; 

    for (int i=1; i < s.Length; i++) 
    { 
    if (s[i] == ',' && s[i-1] == ')')// && i!=beginPos) 
    { 
     splitted.Add(s.Substring(beginPos, i-beginPos)); 
     i++; 
     beginPos = i; 
    } 
    } 

    if(beginPos < s.Length) 
    splitted.Add(s.Substring(beginPos, s.Length-beginPos)); 
Verwandte Themen