Посмотрите на это: http://www.boost.org/doc/libs/1_44_0/libs/regex/doc/html/boost_regex/configuration/algorithm.html
Существование рекурсивного / нерекурсивного различия - довольно убедительное предположение, что BOOST не обязательно является машиной с конечным состоянием в линейном времени. Поэтому есть большая вероятность, что вы сможете добиться большего успеха в своей конкретной проблеме.
Лучший ответ во многом зависит от того, сколько у вас стогов сена и минимальный размер иглы. Если наименьшая стрелка длиннее нескольких символов, вы можете сделать ее немного лучше, чем обобщенная библиотека регулярных выражений.
В основном все строковые поиски работают, проверяя совпадение в текущей позиции (курсор) и, если ничего не найдено, затем пытаются снова с перемещением курсора вправо.
Рабин-Карп создает DFSM из строки (или строк), для которой вы ищете, чтобы тест и движение курсора были объединены в одну операцию. Тем не менее, Rabin-Karp изначально был разработан для одной иглы, поэтому вам нужно будет поддерживать возврат назад, если одно совпадение когда-либо будет правильным префиксом другого. (Помните, что когда вы хотите повторно использовать свой код.)
Другая тактика - сдвинуть курсор более чем на один символ вправо, если это вообще возможно. Бойер-Мур делает это. Обычно он построен для одной иглы. Составьте таблицу всех символов и крайнюю правую позицию, в которой они появляются в игле (если вообще). Теперь установите курсор на len (иглу) -1. Запись в таблице скажет вам (а), какое смещение влево от курсора, что может быть найдена игла, или (б) что вы можете переместить курсор len (игла) дальше вправо.
Когда у вас более одной иглы, конструкция и использование вашего стола усложняются, но, тем не менее, это может спасти вас на порядок на пробниках. Вы все еще можете создать DFSM, но вместо того, чтобы вызывать общий метод поиска, вы вызываете do_this_DFSM_match_at_this_offset ().
Еще одна тактика - проверять более 8 бит одновременно. Существует инструмент для борьбы со спамом, который просматривает 32-битные машинные слова одновременно. Затем он выполняет некоторый простой хэш-код для подгонки результата к 12 битам, а затем просматривает таблицу, чтобы увидеть, есть ли совпадение. У вас есть четыре записи для каждого шаблона (смещения 0, 1, 2 и 3 от начала шаблона), и затем, несмотря на тысячи шаблонов в таблице, они проверяют только один или два на 32-битное слово в теме линия.
В общем, да, вы можете работать быстрее, чем регулярные выражения, КОГДА ИГЛЫ ПОСТОЯННЫ.