Возможно, не полное решение вопроса, но у меня есть несколько замечаний для рассматриваемой проблемы (токенизация строки):
the original regex: (=)|({)|(})|(\|)
is equivalent to: (=|{|}|\|)
is equivalent to: ([={}|])
Все вышеприведенные выражения возвращают одинаковые 21 элемент, но они работают по-разному. Я настроил быстрый тест, пройдя 100 000 итераций операций Split()
с использованием предварительно созданных объектов Regex с RegexOptions.Compiled
и классом Stopwatch
.
- regex # 1 занимает 2002 мс на моем оборудовании
- регулярное выражение # 2 занимает 1691мс
- регулярное выражение № 3 занимает 1542 мс
- регулярное выражение # 4 занимает 1839 мс (это ниже)
YMMV.
Однако нужные элементы могут быть все еще окружены пробелами. Я полагаю, что это также нежелательно, поэтому регулярное выражение, на которое я бы разделился, было бы таким:
\s*([={}|])\s*
Возвращаемые элементы:
["", "{", "key1", "=", "", "{", "key2", "=", "xx", "}", "", "|", "key3", "=", "y", "|", "key4", "=", "z", "}", ""]
Несколько оставшихся пустых строк не должны создавать больших проблем с производительностью при итерации массива, и о них можно позаботиться (читай: игнорировать) при их обнаружении.
РЕДАКТИРОВАТЬ: Если вы измеряете производительность, возможно, вы найдете разделение на ([={}|])
и обрезка элементов массива "вручную" быстрее, чем разделение на \s*([={}|])\s*
. Просто попробуйте, что лучше для вас.