2011-05-19 2 views
0

J'ai cette chaîne:Regex.Split aide en C#

A,B,C[D,E,F[G,H,J[I]],K,L[M,N] 

Et avec Regex.Split() je besoin d'un résultat divisé comme ceci:

A,B 
C[D,E] 
F[G,H] 
J[I] 
K 
L[M,N] 
+2

Ce serait plus facile de le faire sans expression rationnelle. Regexp ne gère pas très bien la structure récursive. En outre, c'est un format de sortie assez étrange ... qu'est-ce que c'est exactement? –

+1

Etes-vous sûr que les supports sont déséquilibrés? –

Répondre

0

Je ne sais pas si vous Je peux le faire purement avec une expression régulière (et si c'est possible alors je suspecte que la regex requise serait horriblement complexe).

est ici une alternative, mais il pourrait être préférable de sauter le regex entièrement et analyser tout manuellement:

string yourString = "A,B,C[D,E,F[G,H,J[I]],K,L[M,N]"; 

var parts = Regex.Split(yourString, @",(?=[^,\[]+\[)|\]+,?") 
       .Where(s => s.Length > 0) 
       .Select(s => s.Contains("[") ? s + "]" : s); 
+0

merci pour votre aide Mais je ne ai utilisé les lettres pour aider à comprendre mon problème, car la chaîne réelle est par exemple ceci: Identifiant, Block [Identifiant, contenu [identifiant, prix, destination]], Description, Mots-clés – expertCode

+0

@expertCode: Ok, j'ai modifié pour accommoder cela. Il aurait mieux valu mentionner cette exigence en premier lieu. – LukeH

+0

Merci !!! très utile! – expertCode

0

Essayez ceci:

Regex re = new Regex(@"((?:\w+)\[(?:(?:\w+\b,?)(?!\[))+)"); 

var result = re.Split(str.Replace(" ", "")) 
       .Select(s => s.TrimEnd(',', '[').TrimStart(']', ',')) 
       .Where(s => !string.IsNullOrEmpty(s));