2009-06-25 9 views
1

Ceci est censé être une question très facile, mais je n'arrive pas à trouver la bonne solution. Il y a une chaîne dans le format suivant:C# Comment diviser (A: B = C) * en utilisant regex?

A:B=C;D:E=F;G:E=H;... 

tandis que A, B et C sont alphanumériques (et peut être inférieur, ainsi que les majuscules). A et B sont de longueur 1+, C peut être vide.

je me suis dit que je dois utiliser quelque chose le long des lignes de

((?<A>.+):(?<B>.+)=(?<C>.*);)* 

mais je ne vois pas comment faire correspondre d'une manière paresseuse. Je ne suis pas sûr non plus de savoir comment obtenir les résultats des matchs respectifs, donc j'apprécierais un petit échantillon de code.

Je serais heureux si vous pouviez me donner un indice.

+0

(modifié pour rendre plus clair et souligner la nécessité pour le code) – mafu

Répondre

4

Vous pouvez utiliser \w pour faire correspondre des caractères alphanumériques plutôt que ., ce qui correspond à tout. Ensuite, vous pouvez essayer de capturer un match à la fois:

(?<A>\w+):(?<B>\w+)=(?<C>\w*); 

Voici un petit exemple:

Regex regex = new Regex("(?<A>\\w+):(?<B>\\w+)=(?<C>\\w*);"); 
string test = "A:B=C;D:E=F;G:E=H"; 

// get all matches 
MatchCollection mc = regex.Matches(test); 

foreach (Match m in mc) { 
    Console.WriteLine("A = {0}", m.Groups["A"].Value); 
    Console.WriteLine("B = {0}", m.Groups["B"].Value); 
    Console.WriteLine("C = {0}", m.Groups["C"].Value); 
} 

Note: il existe plusieurs outils qui vous permettent d'expérimenter avec des expressions régulières et aussi fournir une sorte d'aide; J'aime personnellement Expresso - l'essayer, ce sera très utile pour apprendre.

+0

Merci pour le lien, je vais jeter un oeil! – mafu

2
Regex r = new Regex("(?<A>\\w)+:(?<B>\\w)+=(?<C>\\w)*;"); 

Le \ w correspondent caractères alphanumériques et souligner, ce qui équivaut à [a-zA-Z0-9_].

La barre oblique inverse est échappée dans la chaîne, elle devient alors \\ w. L'expression régulière capture les groupes A, B et C et correspond à 0 ou plusieurs éléments de C ou à des groupes entiers délimités par le point-virgule.

Vous aurez plusieurs objets Match:

MatchCollection m = r.Matches(sampleInput); 
// m[0] will contain A:B=C; 
// m[1] will contain D:E=F; 
// m[2] will contain G:E=H; 
// ... 
5

est-regex une exigence? Étant donné que la chaîne a une très structuré, bien, la structure, il est facile à analyser sans regex:

string input = "A:B=C;D:EF=G;E:H=;I:JK=L"; 
string[] elements = input.Split(new[] { ';' }); 
List<string[]> parts = new List<string[]>(); 
foreach (string element in elements) 
{ 
    parts.Add(element.Split(new[] { ':', '=' })); 
} 
// result output 
foreach (string[] list in parts) 
{ 
    Console.WriteLine("{0}:{1}={2}", list[0], list[1], list[2]); 
} 

La sortie sera:

A:B=C 
D:EF=G 
E:H= 
I:JK=L 
+0

Pourquoi faire tout ce qui divise et déconner avec les listes quand une seule ligne avec Regex vous donnera une collection d'objets Match, déjà étiquetés avec des groupes? –

+0

Ce n'est pas une exigence. J'utilisais en fait string.split mais il semblait un peu gonflé. – mafu

+0

Juste en présentant une autre manière; Je vois parfois regex utilisé quand ce n'est pas nécessaire (coupable de moi-même). Parfois, ne pas apporter une nouvelle langue à la table peut être une bonne chose. –

Questions connexes