![]() |
Re: schnelleres StringReplace und MultiStringReplace
Im Post #1 wurde noch eine neuer Abschnitt eingefügt ... siehe "Ein Vorteil der gemeinsamen Ersetzung:"
'Old1' => '<New1 Old2>' 'Old2' => '<New2 Old1>' Text old1 old2 Old1 Old2 old1 old2 Old1 Old2 Text Text old1 old2 <New1 Old2> <New2 Old1> old1 old2 Old1 Old2 Text Text old1 old2 <New1 <New2 Old1>> Old2 old1 old2 Old1 Old2 Text |
Re: schnelleres StringReplace und MultiStringReplace
Hi himitsu,
das neue Flag funktioniert einwandfrei! Jetzt ist es ein vollwertiger Ersatz für das originale StringReplace. Danke, Stefan |
AW: schnelleres StringReplace und MultiStringReplace
Hallo himitsu,
entschuldige, dass ich diesen etwas älteren Fred nochmal aufwärmen muss, bin aber auf einen Fehler/Exception gestoßen, die ich einfach nicht weg kriege. Es wird immer eine Exception geschmissen, wenn im Suchstring das zu ersetzende Pattern ganz am Ende steht: Erste Gelegenheit für Exception bei $75669617. Exception-Klasse ERangeError mit Meldung 'Fehler bei Bereichsprüfung' in der Zeile:
Delphi-Quellcode:
Hier der Test-Code zum Nachvollziehen:
Move(S[i], Result[i2], i4 * SizeOf(Char));
Delphi-Quellcode:
Steht der Text am Anfang oder irgendwo in der Mitte (es folgt also noch mindestens ein Buchstabe), so läuft die Funktion einwandfrei.
dummy:='Text Old';
ergebnis := StrRep.StringReplace(dummy, 'Old', 'New', [rfReplaceAll]); Assert(ergebnis='Text New'); Vielleicht kannst du mich/uns erhellen... Danke, Stefan |
AW: schnelleres StringReplace und MultiStringReplace
Hmmm, hast du mal einen TestString parat?
Mir ist grade aufgefallen, daß in meinem Testcode das Pattern auch schon am Ende des Strings liegt. und ebenso hier tritt kein Fehler auf.
Delphi-Quellcode:
S := '123Wort';
S2 := StringReplace(S, 'Wort', 'xxx', [rfReplaceAll]); |
AW: schnelleres StringReplace und MultiStringReplace
Steht doch oben als Delphi Code!
Ich benutze Delphi 2010 und du? |
AW: schnelleres StringReplace und MultiStringReplace
Dein Beispiel knallt bei mir auch!
exception number : 1 exception class : ERangeError exception message : Range check error. main thread ($17c4): 005376bc +03dc STGCommonUnitTest.exe StrRep 132 +37 StringReplace |
AW: schnelleres StringReplace und MultiStringReplace
Das hatte ich vorhin auch zum Testen verwendet. :gruebel:
Welche Version nutzt du denn? Die _300 aus Beitrag #1 sollte die aktuellere Version 1.1 vom 20.11.2009 22°° sein. (is'n bissl blöd, das mit den nun fehlenden Attachment-Kommentaren und den veränderten Dateinamen) Ich teste gleich nochmal 'n bissl rum. (bin grade auf die Idee gekommen mal wieder die Bereichsprüfung zu aktiveren :oops: ) |
AW: schnelleres StringReplace und MultiStringReplace
Ich benutze "natürlich" die v1.1.
Wenn ich die Move-Zeile mit einer If-Abfrage auf i4<>0 ändere, geht alles gut:
Delphi-Quellcode:
if i4<>0 then Move(S[i], Result[i2], i4 * SizeOf(Char));
|
AW: schnelleres StringReplace und MultiStringReplace
Jupp, genau sowas hatte ich grade verbaut.
Hach ja, der Fehler ist in meinem aktiven Code nie aufgefallen, aber dazu sei vielleicht erwähnt, daß der Originalcode eine andere Stringverwaltung via PChar besitzt. :oops: ähhhh ... ich würde es ja gerne Anhängen, aber das geht nicht. :shock: Also bitte vor alle "Move" das "if i4 <> 0 then " einfügen. |
AW: schnelleres StringReplace und MultiStringReplace
Bin gerade mal Step-by-Step da durchgegangen mit deinem Beispiel mit 123Wort:
i=8 Length(S)=7 i2=7 i4=0 Der Knall kommt dann vom S[i]=S[8] bei einem String mit 7 Zeichen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz