Gibt es eine Delphi D2010-Funktion wie PosEx, die eine Teilzeichenfolge innerhalb einer Zeichenfolge findet, die am Ende der Zeichenfolge beginnt?
Ich entferne alle Aufrufe an die FastStrings-Bibliothek, und eine der Funktionen, die ich verwendete, war FastPosBack:
%Vor%Ich habe LastDelimiter gefunden, aber es ist nicht ganz dasselbe, da es nur das letzte Trennzeichen findet und ich keine Startposition angeben kann.
Danke!
Update : Nach dem DR-Kommentar habe ich diese Funktion erstellt:
%Vor%Gibt es einen effektiveren Weg, dies zu tun? Bei einem Schleifenzyklus von 1000000 benötigt Pos 47 ms, während FastPosBack 234 ms benötigt.
Versuchen Sie Folgendes:
%Vor%Die Überladung bietet eine Möglichkeit, RPos mit den effizientesten Startpunkten aufzurufen, um vom Ende der Zeichenfolge aus zu suchen, ohne diese selbst berechnen zu müssen. Aus Effizienzgründen erfolgt keine Überprüfung auf startpos, wenn explizit angegeben.
In meiner SmokeTest Leistungstestsuite ist das ungefähr 20% schneller als bei Ihrem FastPosBack (welches übrigens einen "Aus-eins" -Fehler enthält und einige Parameter benötigt, die es nicht wirklich benutzt).
Sie können Pos
in Kombination mit ReverseString
(von StrUtils)
Delphi kommt mit einer Funktion, die rückwärts suchen kann, SearchBuf
in der StrUtils-Einheit. Es ist jedoch auf die Suche nach Wörtern spezialisiert, sodass es sich möglicherweise nicht so verhält, wie Sie es möchten. Unten habe ich es in eine Funktion eingewickelt, die zu Ihrer gewünschten Schnittstelle passt.
Überlegen Sie zuerst, ob eine geschwindigkeitsoptimierte Lösung notwendig ist. Wenn es nicht wahrscheinlich ist, dass es 100000 Mal im echten Gebrauch aufgerufen wird, ist die Umkehrung der Strings und die Verwendung der vorhandenen Teilstringsuche in Ordnung.
Wenn Geschwindigkeit ein Problem ist, gibt es viele gute Ressourcen für das Schreiben Ihrer eigenen. Suchen Sie in Wikipedia nach "String Search Algorithmen" für Ideen. Ich werde einen Link und einen Beispielalgorithmus veröffentlichen, wenn ich an einem Computer bin. Ich tippe dies gerade von meinem Telefon.
Aktualisierung:
Hier ist das Beispiel, das ich versprochen habe:
%Vor%Es ist im Grunde ein umgekehrter naive (Brute-Force) String-Suchalgorithmus. Es beginnt am Ende sowohl des Musters als auch des Textes und arbeitet sich bis zum Anfang fort. Ich kann garantieren, dass es weniger effizient ist als Delphis Pos () -Funktion, obwohl ich nicht sagen kann, ob es schneller oder langsamer als die Pos () - ReverseString () - Kombination ist, da ich es nicht getestet habe. Es gibt einen Fehler darin, für den ich keine Ursache gefunden habe. Wenn die beiden Strings identisch sind, wird -1 zurückgegeben (nicht gefunden).
Ich verwende die RPOS-Varianten von Free Pascals Strudils-Funktion:
Der String, String-Version ist fast das gleiche wie Deltics, aber es gibt Varianten:
Funktion RPoSEX (C: char; const S: AnsiString; offs: kardinal): Ganzzahl; Überlastung; Funktion RPosex (Const Substr: AnsiString; Const Quelle: AnsiString; offs: Kardinal): Integer; Überlastung; Funktion RPos (c: char; const S: AnsiString): Ganzzahl; Überlastung; Funktion RPos (Const Substr: AnsiString; Const Quelle: AnsiString): Integer; Überlast;
Sie sind lizensiert und haben die LGPL + -Linking-Ausnahme-Lizenz von FPC, aber seit ich sie geschrieben habe, entlasse ich sie hiermit unter der BSD-Lizenz.
Nicht in der Standard-RTL, sondern in INDY (Unit idGlobalProtocols gemäß der Online-Hilfe), die Teil der letzten Delphi-Installationen ist:
%Vor%Wenn Sie vor der Suche eine Groß- oder Kleinschreibung aSubstr und aString hinzufügen, kann Deltics die Groß- / Kleinschreibung nicht berücksichtigen. Ich denke, er hat dich verlassen, um das zu tun, bevor du RPos anrufst. aber vielleicht kann ein optionaler Parameter den Job erledigen.
So sollte Deltics Ziel aussehen:
%Vor%Tags und Links delphi delphi-2010 delphi-2009