Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi schnelleres StringReplace und MultiStringReplace (https://www.delphipraxis.net/143654-schnelleres-stringreplace-und-multistringreplace.html)

himitsu 22. Nov 2009 10:18

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

GPRSNerd 22. Nov 2009 11:01

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

GPRSNerd 7. Jun 2010 21:44

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:
Move(S[i], Result[i2], i4 * SizeOf(Char));
Hier der Test-Code zum Nachvollziehen:
Delphi-Quellcode:
  dummy:='Text Old';
  ergebnis := StrRep.StringReplace(dummy, 'Old', 'New', [rfReplaceAll]);
  Assert(ergebnis='Text New');
Steht der Text am Anfang oder irgendwo in der Mitte (es folgt also noch mindestens ein Buchstabe), so läuft die Funktion einwandfrei.

Vielleicht kannst du mich/uns erhellen...

Danke,
Stefan

himitsu 10. Jun 2010 12:12

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]);

GPRSNerd 10. Jun 2010 12:39

AW: schnelleres StringReplace und MultiStringReplace
 
Steht doch oben als Delphi Code!

Ich benutze Delphi 2010 und du?

GPRSNerd 10. Jun 2010 12:45

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

himitsu 10. Jun 2010 12:51

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: )

GPRSNerd 10. Jun 2010 12:53

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));

himitsu 10. Jun 2010 13:01

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.

GPRSNerd 10. Jun 2010 13:10

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 07:40 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz