W programie czytam w niektórych plikach danych, których część jest sformatowana jako seria rekordów w nawiasach kwadratowych. Każdy rekord zawiera tytuł sekcji i serię par klucz/wartość.Czy możesz poprawić ten kod wyrażeń regularnych C#?
Pierwotnie napisałem kod do pętli i wyodrębnienie wartości, ale zdecydowałem, że można to zrobić bardziej elegancko za pomocą wyrażeń regularnych. Poniżej znajduje się mój wynikowy kod (właśnie go zhakowałem na razie w aplikacji konsolowej - więc wiem, że nazwy zmiennych nie są zbyt dobre, itp.)
Czy możesz zaproponować ulepszenia? Uważam, że nie powinno to być konieczne dwa mecze i podciąg, ale nie można dowiedzieć się, jak zrobić to wszystko w jednym dużym kroku:
string input = "[section1 key1=value1 key2=value2][section2 key1=value1 key2=value2 key3=value3][section3 key1=value1]";
MatchCollection matches=Regex.Matches(input, @"\[[^\]]*\]");
foreach (Match match in matches)
{
string subinput = match.Value;
int firstSpace = subinput.IndexOf(' ');
string section = subinput.Substring(1, firstSpace-1);
Console.WriteLine(section);
MatchCollection newMatches = Regex.Matches(subinput.Substring(firstSpace + 1), @"\s*(\w+)\s*=\s*(\w+)\s*");
foreach (Match newMatch in newMatches)
{
Console.WriteLine("{0}={1}", newMatch.Groups[1].Value, newMatch.Groups[2].Value);
}
}
Miło, nie wiedziałem o użyciu opcji IgnorePatternWhitespace, aby umożliwić sformatowanie takiego wyrażenia regularnego. Dzięki za wskazówkę. –
+1 dla RegexOptions.IgnorePatternWhitespace tak dla czytelności –
+1 Ja też wolę nazwane przechwytywania. Sprawiają, że kod jest czytelny i łatwy do zrozumienia. –