Используя более конкретное регулярное выражение
new Regex(@"^[^:]*:", RegexOptions.Compiled);
Ваш .*:
делает это
.*
соответствует всем, жадно, поэтому он работает до конца строки.
:
пытается найти соответствие, поэтому механизм регулярных выражений возвращает один символ за раз (это называется обратным отслеживанием), чтобы найти соответствие. Останавливается на первом найденном двоеточии (видно с конца строки)
тогда как ^[^:]*:
делает это:
^
привязывает регулярное выражение к началу строки. совпадений в середине строки не может быть.
[^:]*
соответствует всем, кроме двоеточий, жадно, поэтому он бежит прямо к первому двоеточию
:
может легко совпадать, потому что следующим символом является двоеточие. Готово.
Откат не требуется, это означает, что он также более эффективен.