Оптимизируйте поиск совпадений в массиве строк, используя массив регулярных выражений - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть два массива.Один, который заполнен значениями, извлеченными из базы данных, а другой - загруженный пользователем массив шаблонов регулярных выражений для сопоставления:

db_array = ["ABCDEFG", "HIJKLMN", "OPQRSTU", "VWXYZ", etc...]
matching_array = ["(OPQRST)(3)?(.{1,})?", "(WXY)(1)?(.{1,})?", "(HIJKLMN)(3)?(.{1,})?", etc...]

Есть ли лучший способ найти любое / все совпадения в db_array, используяmatch_array, а не итерация по соответствующему массиву, а затем по db_array и извлечение любых совпадений?

matching_array.map{|regex| db_array.select{|a| /#{regex}/.match}}

Проблема в том, что в обоих этих массивах может быть более 3000+ записей, и это занимает значительное количество времени.Тем более, что match_array создается несколько раз с использованием разных критериев шаблона.Пытаюсь также ограничить количество звонков из БД, поскольку я не хочу постоянно попадать на сервер.

1 Ответ

0 голосов
/ 25 сентября 2019

Если вы можете быть уверены, что регулярные выражения не используют расширения PCRE (посмотрите назад и т. Д.), То вы можете использовать гораздо более быструю библиотеку регулярных выражений.

Google поддерживает один с именем re2 (https://github.com/google/re2).

Доступны привязки Ruby (https://github.com/stefanor/ruby-re2, среди прочих).

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