Moim ostatecznym celem jest zamiana następującego ciągu w JSON, ale chciałbym zadowolić się czymś, co przybliża mnie o krok, łącząc nazwę pola z każdą z wartości.Potrzebuję pomocy w dopasowaniu/zamianie Regexa
próbki danych:
Field1:abc;def;Field2:asd;fgh;
Korzystanie Regex.Replace(), muszę go przynajmniej wyglądać następująco:
Field1:abc,Field1:def,Field2:asd,Field2:fgh
Ostatecznie, wynik ten będzie niesamowite, jeśli można to zrobić przez Regex w jednym wywołaniu.
{"Field1":"abc","Field2":"asd"},{"Field1":"def","Field2":"fgh"}
Próbowałem wiele różnych odmian tego wzoru, ale nie wydaje się uzyskać to prawo:
(?:(\w+):)*?(?:([^:;]+);)
tylko jeden przykład mogę stwierdzić, że robi coś podobnego, ale tylko wystarczająco dużo różnic, że nie mogę tego włożyć.
Regex to repeat a capture across a CDL?
EDIT:
Oto moje rozwiązanie. Nie zamierzam opublikować tego jako "Rozwiązanie", ponieważ chcę przyznać kredyt temu, który został opublikowany przez innych. W końcu wziąłem kawałek z każdego z opublikowanych rozwiązań i wymyśliłem ten. Dziękuję wszystkim, którzy napisali. Dałem kredyt rozwiązanie, które skompilowane, wykonane najszybciej i miał najdokładniejsze wyniki.
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));
Jeżeli wykonanie LINQ jest blisko Regex Jestem gra. –
Byłoby interesujące porównanie na dużym łańcuchu wejściowym – sll
Zgadzam się. Te same dane tutaj przedstawione są dość małe w porównaniu do tego, co próbuję przekonwertować.Obiekt rzeczywisty zawiera 31 pól i może zawierać 100-200 obiektów. –