AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi schnelleres StringReplace und MultiStringReplace
Thema durchsuchen
Ansicht
Themen-Optionen

schnelleres StringReplace und MultiStringReplace

Ein Thema von himitsu · begonnen am 20. Nov 2009 · letzter Beitrag vom 17. Mär 2016
Antwort Antwort
Seite 2 von 3     12 3      
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#1

AW: schnelleres StringReplace und MultiStringReplace

  Alt 21. Jul 2010, 17:49
Hi, ich verwende deine Stringreplace Routine, allerdings erhalte ich einen Fehler hier:

Delphi-Quellcode:
  Function StringReplaceX(Const S: String; Const OldPattern, NewPattern: Array of String; Flags: TReplaceFlags = []): String;
    Function GetNewPatt(i: Integer): String;
      Begin
        If i < Length(NewPattern) Then Result := NewPattern[i]
        Else If Length(NewPattern) = 1 Then Result := NewPattern[1]
        Else Result := '';
      End;
Fehlermeldung: Erste Gelegenheit für Exception bei $75F89617. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 75F89F11 in Modul 'KERNELBASE.dll'. Lesen von Adresse 00C81000'.

Wenn ich die Exception abfange, rennt er mit OutOfMemory
Steven

Geändert von youuu (21. Jul 2010 um 18:13 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.875 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: schnelleres StringReplace und MultiStringReplace

  Alt 21. Jul 2010, 18:14
In welcher Zeile?
Was hast du als OldPattern bzw. NewPattern übergeben?
Markus Kinzler
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#3

AW: schnelleres StringReplace und MultiStringReplace

  Alt 21. Jul 2010, 18:18
   Else If Length(NewPattern) = 1 Then Result := NewPattern[1] Ist rot markiert, was genau übergeben wurde, werde ich nun nach schauen
Steven
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#4

AW: schnelleres StringReplace und MultiStringReplace

  Alt 21. Jul 2010, 18:29
joar, da stimmt was nicht.
tausch mal die 1 gegen eine 0 aus Result := NewPattern[0] [edit]
oder besser so ... ich denk mal das wäre logischer, wenn der Letzte, anstatt der erste Eintrag genutzt würde.
Delphi-Quellcode:
Function GetNewPatt(i: Integer): String;
  Begin
    If i < Length(NewPattern) Then Result := NewPattern[i]
    Else If Length(NewPattern) > 0 Then Result := NewPattern[High(NewPattern)]
    Else Result := '';
  End;
ich tausche die Anhänge auch gleich aus
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (21. Jul 2010 um 18:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#5

Re: schnelleres StringReplace und MultiStringReplace

  Alt 22. Nov 2009, 10:18
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
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von mkinzler (10. Jun 2010 um 09:21 Uhr) Grund: PRE-Tag entfernt
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: schnelleres StringReplace und MultiStringReplace

  Alt 22. Nov 2009, 11:01
Hi himitsu,

das neue Flag funktioniert einwandfrei! Jetzt ist es ein vollwertiger Ersatz für das originale StringReplace.

Danke,
Stefan
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: schnelleres StringReplace und MultiStringReplace

  Alt 7. Jun 2010, 21:44
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: 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
Stefan

Geändert von GPRSNerd ( 8. Jun 2010 um 20:59 Uhr) Grund: Details zur Exception hinzugefügt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#8

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 12:12
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]);
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 12:39
Steht doch oben als Delphi Code!

Ich benutze Delphi 2010 und du?
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 12:45
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
Stefan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:04 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