Производительность регулярного выражения между или (|) и любым ([] +) - PullRequest
1 голос
/ 20 июня 2011

Я использую Visual C ++ TR1

Мое регулярное выражение пытается соответствовать "бар", строки могут быть

foo bar class
foo;bar
foo; bar
bar foo
bar

регулярное выражение, которое я использую было

(^|[; ]+)bar\\s+

По какой-то причине это очень медленно, если я изменяю регулярное выражение на

(^|;|\\s)bar\\s+

Это дает мне огромное ускорение.Кстати, я использую функцию regex_search.

Может кто-нибудь объяснить, почему это так?

Заранее спасибо.

1 Ответ

2 голосов
/ 20 июня 2011

Эти выражения не являются эквивалентными. Первый занимает любое количество ; точек с запятой и пробелов, а второй занимает только один. Это может помочь увидеть текст, который вам подходит.

Причиной разницы в производительности, вероятно, является «возврат». В первом выражении (^|[; ]+)bar\\s+ есть потенциал для возврата в начале выражения. В (^|;|\\s)bar\\s+ не может быть возврата назад. Возврат означает повторную попытку другого пути через данные на основе другого пути через регулярное выражение. (Однако, если это действительно bar, который вы ищете, не должно быть большой разницы.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...