Разбить строку на ключи и значения

Есть строка
BANDWIDTH=5552610,CODECS="mp4a.40.2,avc1.4d402a",RESOLUTION=1920x1080,FRAME-RATE=60,VIDEO-RANGE=SDR,CLOSED-CAPTIONS=NONE
Проблема в этой части: CODECS="mp4a.40.2,avc1.4d402a"
Здесь есть запятая и по-этому .Split(",") работает неправильно :man_shrugging: Сейчас парсю вручную.
Но может всё-таки как-то автоматически можно? :thinking:

Внутри закавыченного значения значения еще и = может быть, не? я бы нашел все области в кавычках, с учетом того что внутри теоретически еще может быть экранированная двойная кавычка и не одна, заменил бы найденные запятые и знаки равенства на что-то другое, запомнив место где они находились. Разобрал бы и восстановил в значениях запятые и =

Ну там всё может быть :man_shrugging: Но конкретно здесь не бывает.

Собственно, я так и думал. Но это всё-равно что вручную парсить :thinking:
Я не уверен, что авторы этой строки предлагали такие заморочки с парсингом :man_shrugging:

Так это наверно часть формата m3u Как распарсить такое? (M3U, Twitch)
То есть заморочки есть, но есть готовые библиотеки реализующие это.

Так а регулярка чем не устроила?? Чтобы лишних либ не подключать.

А можно ссылочку на сайт?

Ссылочка

А как? Вот находим всё заковыченное:

        private static List<RuTubeVideoFormat> ParsePlaylistManifest(string manifest)
        {
            Regex regex = new Regex("CODECS=\"(.+?)\"");
            MatchCollection matches = regex.Matches(manifest);
            if (matches.Count > 0)
            {
                foreach (Match match in matches)
                {
                    Console.WriteLine(match.Value);
                    System.Diagnostics.Debug.WriteLine(match.Value);
                }
            }
         ....
    }

Теперь в найденном делаем UrlEncode() и тупо реплейсим одно на другое? Там же в Match нет позиции, в которой нашлось совпадение :thinking:
Упс :flushed: Плохо посмотрел. Index же :+1:

Чёта индекс какой-то странный :thinking: В блокноте первое совпадение на позиции 59, а индекс равен 359. Это как?
А, не, индексы правильные. Это я просто индус :grin:

Эх, наговнокодил по-индусски :man_with_turban:
Зацените:

        private static List<RuTubeVideoFormat> ParsePlaylistManifest(string manifest)
        {
            Regex regex = new Regex("CODECS=\"(.+?)\"");
            MatchCollection matches = regex.Matches(manifest);
            Console.WriteLine(manifest);
            int diff = 0;
            for (int i = 0; i < matches.Count; ++i)
            {
                Match match = matches[i];
                string t = $"Index={match.Index} | {match.Value}";
                Console.WriteLine(t);
                System.Diagnostics.Debug.WriteLine(t);

                string tmp = match.Value.Substring(7);
                int actualPos = match.Index + 7;
                int actualLength = match.Length - 7;
                string encoded = HttpUtility.UrlEncode(tmp);
                if (i > 0)
                {
                    diff += encoded.Length - actualLength;
                }
                manifest = manifest.Remove(actualPos + diff, actualLength).Insert(actualPos + diff, encoded);
            }
            Console.WriteLine(manifest);