Означает ли добавление ведущей каретки (^) к выражению регулярного выражения увеличение производительности? - PullRequest
0 голосов
/ 01 марта 2019

В целом (в реализациях регулярных выражений) добавление ведущей каретки (^) к регулярному выражению приводит к увеличению или снижению производительности?

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

Другими словами, ^[regexp] быстрее или медленнее, чем [regexp], игнорируя любые различия в том, чему они могут соответствовать?

Для конкретного примера, скажем,мы пытаемся сопоставить строки URL, чтобы найти любые ссылки на foo.com.

Для этого мы можем использовать регулярное выражение https?://foo\.com/(.*).

Будет ли регулярное выражение ^https?://foo\.com/(.*) еще быстрее?

(Для этого примера не имеет значения, соответствует ли нам строка типа https://anysite.com/?http://foo.com/anyothersite.com.)

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Я думаю, но не уверен, что ^https?://foo\.com/(.*) быстрее, чем без ^, потому что механизм регулярных выражений проверяет начало строки, если она не совпадает, следующую строку напрямую.

0 голосов
/ 01 марта 2019

Да, это должно быть быстрее, по той простой причине, что он может идеально отбрасывать несовпадающую строку после просмотра только самого первого символа.Версия без каретки, возможно, придется искать дальше.

Подумайте об этом так: что для вас, как человека, быстрее?

  • Проверка того, что книга начинается со слова "утро",
  • или подтверждениечто книга содержит это слово где-нибудь?

Концептуально, для компьютера это то же самое.

0 голосов
/ 01 марта 2019

Да, в общем случае, но только когда вход не не совпадает.

Если вход совпадает с начала ввода, добавление ^ не имеет никакого эффекта и толькодобавляет небольшое количество обработки.

Добавление ^ сделает выражение более конкретным и, следовательно, совпадение не удастся быстрее (как можно скорее), вместо того, чтобы потреблять весь ввод, чтобы утверждать, что совпадения нет.

Однако в некоторых языках / ситуациях это не так.Например, при использовании метода java String#matches(), который должен совпадать с входом whole , чтобы получить true, добавление ^ может привести к худшим результатам во всех случаях, поскольку ^ равно подразумевается договором, поэтому добавление одного добавляет время разбора и избыточность.

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