Question

C’est soi-disant une question très facile, mais je n'arrive pas à trouver la bonne solution. Il existe une chaîne au format:

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

alors que A, B et C sont alphanumériques (et peuvent être inférieurs aussi bien que majuscules). A et B sont de longueur 1+, C peut être vide.

Je pensais que je devrais utiliser quelque chose le long des lignes de

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

mais je ne vois pas comment le faire correspondre de manière paresseuse. Je ne sais pas non plus comment obtenir les résultats des correspondances respectives. J'apprécierais donc un petit exemple de code.

Je serais heureux si vous pouviez me donner un indice.

Était-ce utile?

La solution

Vous pouvez utiliser \ w pour faire correspondre les caractères alphanumériques plutôt que . , qui correspond à tout. Ensuite, vous pouvez essayer de capturer une correspondance à 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);
}

remarque : plusieurs outils vous permettent d'expérimenter des expressions régulières et vous permettent également de vous aider. J'aime personnellement Expresso - essayez-le, cela sera très utile pour apprendre.

Autres conseils

La regex est-elle une exigence? Comme la chaîne a une structure très bien structurée, il est facile de l’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]);
}

Le résultat sera:

A:B=C
D:EF=G
E:H=
I:JK=L
Regex r = new Regex("(?<A>\\w)+:(?<B>\\w)+=(?<C>\\w)*;");

Le \ w correspondra aux caractères alphanumériques et au trait de soulignement, ce qui équivaut à [a-zA-Z0-9 _].

La barre oblique inverse est échappée dans la chaîne, elle devient donc \ \ w.

L'expression rationnelle 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;
// ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top