Существует ли функция поиска по Бойеру-Муру, быстрый поиск и замена и быстрый подсчет строк для Delphi 2010 String (UnicodeString)?
Мне нужны три функции быстрого ввода больших строк: быстрый поиск, быстрый поиск и замена и быстрый подсчет подстрок в строке.
Я столкнулся с поиском строк Бойера-Мура в C ++ и Python, но единственный алгоритм Delphi Бойера-Мура, используемый для реализации быстрого поиска и замены, который я обнаружил, является частью FastStrings Питера Морриса, бывшего программного обеспечения DroopyEyes, и его веб-сайта. и электронная почта больше не работает.
Я уже портировалFastStrings Вперед отлично работать с AnsiStrings в Delphi 2009/2010, где байт равен одному AnsiChar, но заставить их работать также со строкой (UnicodeString) в Delphi 2010 представляется нетривиальным.
Используя этот алгоритм Бойера-Мура, должна быть возможность легко выполнять поиск без учета регистра, а также поиск и замену без учета регистра, без какой-либо временной строки (используя StrUpper и т. Д.) И без вызова Pos (), который медленнее, чем Boyer- Поиск Мура, когда требуется повторный поиск по одному и тому же тексту.
(Правка: у меня есть частичное решение, написанное как ответ на этот вопрос, оно почти на 100% выполнено, в нем даже есть функция быстрой замены строк. Я считаю, что в нем ДОЛЖНЫ быть ошибки, и особенно думаю, что, поскольку он претендует на Unicode возможно, что из-за невыполненных обещаний Unicode есть глюки.)
(Edit2: интересный и неожиданный результат; большой размер стека таблицы кодовых точек юникода в стеке - SkipTable в приведенном ниже коде серьезно ограничивает объем win-win-оптимизации, который вы можете выполнить здесь, используя юникод-строку Поиск строк. Спасибо Флоренту Ушету за то, что он указал на то, что я должен был сразу заметить.