Gibt es eine Boyer-Moore-Funktion zum Suchen und schnellen Ersetzen von Zeichenfolgen und eine schnelle Anzahl von Zeichenfolgen für Delphi 2010-Zeichenfolgen (UnicodeString)?
Ich benötige drei Fast-On-Large-Strings-Funktionen: Schnelles Suchen, schnelles Suchen und Ersetzen sowie schnelle Zählung von Teilstrings in einem String.
Ich habe Boyer-Moore-Zeichenfolgensuchen in C ++ und Python kennengelernt, aber der einzige Delphi-Boyer-Moore-Algorithmus, der zum Implementieren des schnellen Suchens und Ersetzens verwendet wird, den ich gefunden habe, ist Teil der FastStrings von Peter Morris, der früher DroopyEyes-Software, und seiner Website und E-Mail funktionieren nicht mehr.
Ich habe bereits @ portie FastStrings Vorwärts, um für AnsiStrings in Delphi 2009/2010 großartig zu funktionieren, wobei ein Byte einem AnsiChar entspricht, es jedoch nicht trivial erscheint, sie auch mit dem String (UnicodeString) in Delphi 2010 arbeiten zu lassen.
Mit diesem Boyer-Moore-Algorithmus sollte es möglich sein, Suchen ohne Berücksichtigung der Groß- und Kleinschreibung sowie Suchen und Ersetzen ohne Berücksichtigung der Groß- und Kleinschreibung ohne temporären String (mit StrUpper usw.) und ohne Aufrufen von Pos (), der langsamer als Boyer ist, durchzuführen -Mehr Suche, wenn wiederholte Suchen über den gleichen Text erforderlich sind.
(Bearbeiten: Ich habe eine Teillösung, die als Antwort auf diese Frage geschrieben wurde. Sie ist fast zu 100% vollständig und verfügt sogar über eine schnelle Funktion zum Ersetzen von Zeichenfolgen. Ich glaube, dass es Fehler geben MUSS, und denke insbesondere, dass dies so ist, als ob es so wäre Unicode-fähig muss es sein, dass es aufgrund unerfüllter Unicode-Versprechen Pannen gibt.)
(Edit2: Interessantes und unerwartetes Ergebnis; Die große Stapelgröße einer Unicode-Codepunkttabelle auf dem Stapel - SkipTable im folgenden Code schränkt die Menge der Win-Win-Optimierung ein, die Sie hier in einer Unicode-Zeichenfolge ausführen können boyer-moore string search. Danke an Florent Ouchet für den Hinweis, was mir sofort aufgefallen sein sollte.)