Подход regex, вероятно, самый быстрый для реализации, но не самый быстрый для запуска. Я сравнил простое решение регулярных выражений со следующим кодом ручного поиска и обнаружил, что код ручного поиска в ~ 2x-2.5x быстрее для больших строк ввода и в 4 раза быстрее для маленьких строк:
static string Search(string expression)
{
int run = 0;
for (int i = 0; i < expression.Length; i++)
{
char c = expression[i];
if (Char.IsDigit(c))
run++;
else if (run == 5)
return expression.Substring(i - run, run);
else
run = 0;
}
return null;
}
const string pattern = @"\d{5}";
static string NotCached(string expression)
{
return Regex.Match(expression, pattern, RegexOptions.Compiled).Value;
}
static Regex regex = new Regex(pattern, RegexOptions.Compiled);
static string Cached(string expression)
{
return regex.Match(expression).Value;
}
Результаты для строки длиной примерно 50 символов с 5-значной строкой в середине, более 10 ^ 6 итераций, задержка на вызов в микросекундах (меньшее число быстрее):
Простой поиск: 0.648396us
Кэшированное регулярное выражение: 2.1414645us
Регулярное выражение без кэширования: 3.070116us
Результаты для строки ~ 40K с 5-значной строкой посередине в течение 10 ^ 4 итераций, задержка на вызов в микросекундах (меньшее число быстрее):
Простой поиск: 423.801us
Кэшированное регулярное выражение: 1155.3948us
Регулярное выражение без кэширования: 1220.625us
Немного удивительно: я ожидал, что Regex - который компилируется в IL - будет сопоставим с ручным поиском, по крайней мере, для очень больших строк.