Эффективность обходных путей в регулярных выражениях C #.Должен ли я избежать их, если смогу? - PullRequest
3 голосов
/ 29 сентября 2010

все!Я довольно новичок в регулярных выражениях, но мне они нравятся, МНОГО!

Назовите меня придирчивым, если хотите, но я бы очень хотел знать, стоит ли мне избегать использования lookaheads и lookbehinds, если у меня естьoption.

Например, две нижеприведенные команды делают одно и то же, одна использует lookbehind, а другая нет.

the_str = Regex.Replace(the_str, @"(;|!|\?) \.{3}", "$1...");

the_str = Regex.Replace(the_str, @"(?<=(;|!|\?)) \.{3}", "...");

Какую из них вы бы использовали?Что эффективнее?

Спасибо за ваши ответы!

1 Ответ

5 голосов
/ 30 сентября 2010

Я тестировал и локально, и метод с использованием 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})", "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...