Самый быстрый (как показано ниже) простой разбиение строки:
line.Split(new char[] { '{', '<', '>', '}', ' ', '^', '"' },
StringSplitOptions.RemoveEmptyEntries);
Следующим быстрым является закрепленное регулярное выражение (безобразно):
Regex lineParse
= new Regex(@"^\{(<([^>]+)>\s*){3,4}(""([^""]+)""\^\^<([^>]+)>\s*)?\}$",
RegexOptions.Compiled);
Match m = lineParse.Match(line);
if (m.Groups[2].Captures.Count == 3)
{
Data data = new Data { C = m.Groups[2].Captures[0].Value,
S = m.Groups[2].Captures[1].Value, P = m.Groups[2].Captures[2].Value,
O = m.Groups[4].Value, T = m.Groups[5].Value };
} else {
Data data = new Data { C = m.Groups[2].Captures[0].Value,
S = m.Groups[2].Captures[1].Value, P = m.Groups[2].Captures[2].Value,
O = m.Groups[2].Captures[3].Value, T = String.Empty };
}
Время для 1M строк случайных данных (String.Split в качестве базовой линии):
Method #1 Wall ( Diff) #2 Wall ( Diff)
------------------------------------------------------------
line.Split 3.6s (1.00x) 3.1s (1.00x)
myRegex.Match 5.1s (1.43x) 3.3s (1.10x)
itDependsRegex.Matches 6.8s (1.85x) 4.4s (1.44x)
stateMachine 8.4s (2.34x) 5.6s (1.82x)
alanM.Matches 9.1s (2.52x) 7.8s (2.56x)
yourRegex.Matches 18.3s (5.06x) 12.1s (1.82x)
Обновлено для включения регулярных выражений @AlanM и @itdepends. Похоже, что Regex.Matches медленнее, чем Regex.Match, однако, чем больше контекстных подсказок вы дадите парсеру, тем лучше он будет работать. Единственный класс отрицательных символов, используемый @AlanM, прост для чтения, но медленнее, чем самый загадочный (мой). Снимаю шляпу перед @itdepends для самого простого регулярного выражения, которое дает самое быстрое время. Хорошо, и хотя я думал, что было бы сумасшествием писать конечный автомат для разбора строки, на самом деле он вовсе не работает плохо ... спасибо @RexM за предложение. Я также добавил время от моего Q6600 дома (# 2) против старшего Xeon на работе (# 1).