Il mio obiettivo finale qui è quello di trasformare la seguente stringa in JSON, ma mi accontenterei di qualcosa che mi fa un passo avanti combinando il nome del campo con ciascuno dei valori.Ho bisogno di aiuto su un modello di corrispondenza/sostituzione Regex
dati di esempio:
Field1:abc;def;Field2:asd;fgh;
Utilizzando Regex.Replace(), ho bisogno di almeno simile a questa:
Field1:abc,Field1:def,Field2:asd,Field2:fgh
In definitiva, questo risultato sarebbe impressionante se si può fare via Regex in una sola chiamata.
{"Field1":"abc","Field2":"asd"},{"Field1":"def","Field2":"fgh"}
Ho provato molte diverse varianti di questo modello, ma non riesco a farlo bene:
(?:(\w+):)*?(?:([^:;]+);)
Solo un altro esempio che ho trovato che sta facendo qualcosa di simile, ma solo abbastanza differenze che non riesco a mettere il dito su di esso.
Regex to repeat a capture across a CDL?
EDIT:
Ecco la mia soluzione. Non ho intenzione di postarlo come una "Soluzione" perché voglio dare credito a uno che è stato pubblicato da altri. Alla fine, ho preso un pezzo da ognuna delle soluzioni pubblicate e ho trovato questo. Grazie a tutti quelli che hanno pubblicato. Ho dato credito alla soluzione che ha compilato, eseguito più velocemente e ha avuto i risultati più accurati.
string hbi = "Field1:aaa;bbb;ccc;ddd;Field2:111;222;333;444;";
Regex re = new Regex(@"(\w+):(?:([^:;]+);)+");
MatchCollection matches = re.Matches(hbi);
SortedDictionary<string, string> dict = new SortedDictionary<string, string>();
for (int x = 0; x < matches.Count; x++)
{
Match match = matches[x];
string property = match.Groups[1].Value;
for (int i = 0; i < match.Groups[2].Captures.Count; i++)
{
string key = i.ToString() + x.ToString();
dict.Add(key, string.Format("\"{0}\":\"{1}\"", property, match.Groups[2].Captures[i].Value));
}
}
Console.WriteLine(string.Join(",", dict.Values));
Se le prestazioni di LINQ è vicino a Regex, io sono partita. –
Sarebbe interessante confrontare su stringa di input grande – sll
Accetto. Gli stessi dati mostrati qui sono piuttosto piccoli rispetto a quello che sto tentando di convertire.L'oggetto reale contiene 31 campi e potrebbe contenere 100-200 oggetti. –