Оптимальный парсинг строки

Имеется множество строк, состоящие из разного количества подстрок.
Все подстроки разделены пробелами.
Первая подстрока всегда и начинается с '>' и далее там могут идти ещё несколько символов.
Все остальные, кроме последней, идут в квадратных скобках, внутри которых имеются нужные данные в виде "[key=value]", value может содержать пробелы. Эти подстроки могут меняться местами. Последняя подстрока это неразрывный набор латиницы верхнего регистра.

Нужно выделить из этого набора несколько нужных подстрок и засунуть в объект класса

Пример строк:

>dfg|sf_sdfg0.1 [gene=aziz] [musor1=otyuj] [musor2=fsdgk] [protein=73545] KHGDBSS
>vgv|kjs_u9.5_W [protein=pivo vkusno] [musor3=dsfg] [gene=mama] LJDFSGJKHKGJGKB

Нужно вытащить по ключу gene=, protein= и последнюю строку
На выходе должен получится массив строк :

{"aziz", "73545", "KHGDBSS"}
{"mama", "pivo vkusno", "LJDFSGJKHKGJGKB"}

Если строка не будет иметь ключа gene= - её нужно пропустить.

P.S. Сейчас имеется рабочий вариант, на куче проверок вхождения строк и вытаскивания индексов. Работает медленно, боюсь для ускорения нужны будут 'Регулярные выражения', с которыми я пока не дружу, или ещё какие шарповые уловки, о которых я даже не догадываюсь.

U.D.P. забыл добавить что строка Атрибутов всегда начинается с новой строчки и пишется в одну строку, а последняя часть с латиницей в верхнем регистре всегда начинается со следующей строки делится на блоки по 70 символов.

>idf|sdf [attr1=x] [attr2=y] [attr3=z]
DFG..DFF // 70 символов
DRF..RGE // 70 символов
WEL..TRT // 70 символов
RRG // Остаток переноса

Ответы (1 шт):

Автор решения: aepot

Не знаю, насколько это будет быстрее работать, чем ваше то, чего я не видел, но проверок явно не куча.

static void Main(string[] args)
{
    string text = ">dfg|sf_sdfg0.1 [gene=aziz] [musor1=otyuj] [musor2=fsdgk] [protein=73545] KHGDBSS\r\n>vgv|kjs_u9.5_W [protein=pivo vkusno] [musor3=dsfg] [gene=mama] LJDFSGJKHKGJGKB";
    string[] include = new string[] { "gene", "protein" };
    char[] braces = "[]".ToCharArray();

    foreach (string line in text.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries))
    {
        var tokens = line.Split(braces).Select(x => x.Trim()).Where(x => x.Length > 0);
        string[] values = new string[include.Length + 1];

        foreach (string token in tokens)
        {
            string[] pair = token.Split("=");
            if (pair.Length == 2)
            {
                int index = Array.IndexOf(include, pair[0]);
                if (index >= 0)
                    values[index] = pair[1];
            }
        }
        values[^1] = tokens.Last();

        Console.WriteLine("{" + string.Join(", ", values.Select(x => $"\"{x}\"")) + "}");
    }
}
{"aziz", "73545", "KHGDBSS"}
{"mama", "pivo vkusno", "LJDFSGJKHKGJGKB"}
→ Ссылка