Domanda

Questa è presumibilmente una domanda molto semplice, ma non riesco proprio a trovare la soluzione giusta. C'è una stringa nel formato:

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

mentre A, B e C sono alfanumerici (e possono essere sia minuscoli che maiuscoli). A e B sono di lunghezza 1+, C può essere vuoto.

Ho pensato che avrei dovuto usare qualcosa del genere

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

ma non vedo come abbinarlo in modo pigro. Inoltre, non sono sicuro di come ottenere i risultati delle rispettive partite, quindi apprezzerei un piccolo esempio di codice.

Sarei felice se potessi darmi un suggerimento.

È stato utile?

Soluzione

È possibile utilizzare \ w per abbinare caratteri alfanumerici anziché . , che corrisponde a tutto. Quindi, potresti provare a catturare una partita alla volta:

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

Ecco un piccolo esempio:

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

nota : esistono diversi strumenti che ti consentono di sperimentare espressioni regolari e forniscono anche una sorta di aiuto; Personalmente mi piace Expresso - provalo, sarà molto utile per l'apprendimento.

Altri suggerimenti

Regex è un requisito? Poiché la stringa ha una struttura molto strutturata, beh, è ??facile analizzarla senza 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]);
}

L'output sarà:

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

\ w corrisponderà a caratteri alfanumerici e di sottolineatura, equivalenti a [a-zA-Z0-9_].

La barra rovesciata viene salvata nella stringa, quindi diventa \ \ w.

Il regex acquisisce i gruppi A, B e C e corrisponderà a 0 o più elementi di C o interi gruppi delimitati dal punto e virgola.

Avrai più oggetti 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;
// ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top