Alle build-in Delphi Funktion wie PosEx findet sich eine sub-Zeichenkette beginnend von der Rückseite des Strings?
Gibt es eine Delphi-D2010-Funktion wie PosEx findet eine Teilzeichenfolge innerhalb einer Zeichenfolge vom Ende der Zeichenfolge?
Ich bin die Beseitigung aller Anrufe an die FastStrings Bibliothek und eine der Funktionen war ich mit war FastPosBack:
function FastPosBack(const aSourceString, aFindString : AnsiString; const aSourceLen, aFindLen, StartPos : Integer) : Integer;
Fand ich LastDelimiter aber es ist nicht ganz das gleiche, da es nur findet das Letzte Trennzeichen, und ich kann nicht geben Sie eine start-position.
Dank!
Update: Nach DR Kommentar, ich habe diese Funktion:
function FastPosBack(const aSourceString, aFindString : String; const aSourceLen, aFindLen, StartPos : Integer) : Integer;
var
RevSourceString, RevFindString: string;
begin
RevSourceString := AnsiReverseString(aSourceString);
RevFindString := AnsiReverseString(aFindString);
Result := Length(aSourceString) - PosEx(RevFindString, RevSourceString, StartPos) + 1;
end;
Gibt es eine effektive Möglichkeit, dies zu tun? Auf eine 1000000 loop, Pos 47ms dauert, während FastPosBack nimmt 234ms abgeschlossen.
- Nur aus Neugier: wie lief dein test Aussehen genau?
- Ich nenne GetTickCount, gefolgt von einer 1000000-Schleife der Aufruf an die Funktion und erhalten dann die Differenz, GetTickCount - TickCount.
- Ich war mehr daran interessiert, was Zeichenfolgen, die Sie an die Funktionen für die Prüfung...
- Für den SourceString "dfkfkL%&/s"#<.676505" und für den SearchString "#<". Ziemlich kleine Zeichenfolgen zu suchen.
- Ich glaube nicht, dass alle, die Funktion kopiert den gesamten string kann als "schnell"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, dieser/diese:
Überlastung bietet eine Möglichkeit zum aufrufen von RPos mit der effizientesten startpos für die Suche vom Ende des Strings, ohne zu berechnen, dass Sie sich. Für die Effizienz wird keine Prüfung durchgeführt wird, auf startpos, wenn explizit angegeben.
In meinem SmokeTest-performance-Test-suite diese kommt etwa 20% schneller als Ihre FastPosBack (die enthält übrigens ein "off by one" - Fehler sowie erfordern einige Parameter, die es eigentlich nicht verwenden).
Können Sie
Pos
in Kombination mitReverseString
(aus StrUtils)Delphi kommt mit einer Funktion, die Suche rückwärts,
SearchBuf
in der unit StrUtils. Es ist spezialisiert für die Suche nach Worten, aber so ist es vielleicht nicht Verhalten, ganz wie Sie wollen. Unten habe ich wickelte es in eine Funktion gefunden, die Ihren gewünschten Schnittstelle.Zunächst zu prüfen, ob eine Geschwindigkeit optimierte Lösung notwendig ist. Wenn Ihr nicht wahrscheinlich, dass es aufgerufen wird 100000 mal im realen Einsatz Umkehrung der Saiten und die Verwendung der vorhandenen substring-Suche ist in Ordnung.
Wenn Geschwindigkeit ein Problem ist, es gibt viele gute Ressourcen für das schreiben Sie eigene. Schauen Sie auf wikipedia nach "string-Suchalgorithmen" für Ideen. Ich poste einen link und ein Beispiel-Algorithmus, wenn ich an einem computer. Ich Schreibe dies von meinem Handy im moment.
Update:
Hier ist das Beispiel, das ich versprochen:
Seine im Grunde ein umgekehrtes naiv(brute-force) string-Suche-Algorithmus. Es beginnt am Ende der beiden Muster und text und arbeitet seinen Weg zurück an den Anfang. Ich kann garantieren, es ist weniger effizient als die von Delphi Pos () - Funktion kann ich zwar nicht sagen, ob Ihr schneller oder langsamer als die Pos()-ReverseString (), Kombination, wie ich es noch nicht getestet. Es ist ein Fehler, die ich noch nicht gefunden, die Ursache. Wenn die beiden strings identisch sind, seine Rückgabe -1 (nicht gefunden).
Ich die RPOS-Varianten von Free Pascal ist strutils Funktion:
http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/rtl/objpas/strutils.pp?view=markup
den string,string version ist fast die gleiche wie Deltics', aber es gibt die Varianten:
Function RPosEX(C:char;const S : AnsiString;offs:cardinal):Integer; overload;
Function RPosex (Const Substr : AnsiString; Const Source : AnsiString;offs:cardinal) : Integer; overload;
Function RPos(c:char;const S : AnsiString):Integer; overload;
Function RPos (Const Substr : AnsiString; Const Source : AnsiString) : Integer; overload;
Sie sind lizenziert unter FPC die GPL+linking-exception-Lizenz, aber da schrieb ich Ihnen, dass ich hiermit die Freigabe, die unter BSD-Lizenz.
Nicht in der standard-RTL, aber in INDY (Einheit idGlobalProtocols laut der online-Hilfe), die Teil der jüngsten Delphi-Installationen:
Vielleicht hinzufügen Uppercasing oder Kleinschreibung aSubstr und aString Parameter, bevor Sie die Suche vornehmen können, Deltics Zweck der groß-und Kleinschreibung. Ich denke, verließ er Sie dazu vor dem Aufruf von RPos. aber vielleicht ist ein optionaler parameter, der den job tun können.
dies ist, wie Deltic Zweck Aussehen soll: