Мне нужны три функции fast-on-large-strings: быстрый поиск, быстрый поиск и замена, а также быстрый подсчет подстрок в строке.
Я столкнулся с поисковыми строками Boyer-Moore в С++ и Python, но единственный алгоритм Delphi Boyer-Moore, используемый для быстрого поиска и замены, который я нашел, является частью FastStrings Питером Моррисом, ранее имевшим программное обеспечение DroopyEyes, и его веб-сайт и электронная почта больше не работают.
Я уже портировал FastStrings вперед, чтобы отлично работать для AnsiStrings в Delphi 2009/2010, где байт равен одному AnsiChar, но делает они также работают со строкой (UnicodeString) в Delphi 2010, которая выглядит нетривиальной.
Используя этот алгоритм Бойера-Мура, можно легко делать нечувствительные к регистру поисковые запросы, а также без учета регистра и замены без какой-либо временной строки (используя StrUpper и т.д.) и без вызова Pos(), который медленнее чем поиск Boyer-Moore, когда требуется повторный поиск по тому же тексту.
(Edit: у меня есть частичное решение, написанное как ответ на этот вопрос, оно почти на 100% завершено, оно даже имеет функцию быстрой замены строки. Я считаю, что ДОЛЖЕН иметь ошибки, и особенно думаю, что, поскольку он притворяется чтобы быть Unicode способным, что должно быть, что есть глюки из-за невыполненного Unicode promises.)
(Edit2: Интересный и неожиданный результат: большой размер стека таблицы кодовых слов в кодировке Unicode в стеке - SkipTable в коде ниже помещает серьезный демпфер на количество выигрышной оптимизации, которую вы можете сделать здесь, в Строка поиска юникода string boyer-moore. Спасибо Florent Ouchet за то, что я сразу заметил.)