Я тестировал и локально, и метод с использованием lookbehind был примерно на 25% медленнее.
Другой вариант, который я тестировал с использованием lookahead вместо lookbehind, был всего на 10% медленнее:* Я не думаю, что есть разница в производительности, чтобы советовать всегда избегать обходных путей.Если вы думаете, что это делает код более читабельным, используйте его.Оптимизируйте производительность только в том случае, если профилирование показывает, что у вас проблемы с производительностью, а регулярное выражение является узким местом.
Для справки: строка, которую я тестировал, была "blah; ... foo ...; bar bar ? ..."
повторена 1000 раз, и я повторял каждый тест 100 раз.1009 *
0.944s No lookarounds Regex.Replace(s, @"(;|!|\?) \.{3}", "$1...")
1.027s Look ahead Regex.Replace(s, @"(;|!|\?) (?=\.{3})", "$1")
1.210s Look behind Regex.Replace(s, @"(?<=(;|!|\?)) \.{3}", "...")
1.124s Both Regex.Replace(s, @"(?<=(;|!|\?)) (?=\.{3})", "")