Code-Library -> Object-Pascal / Delphi-Language ->
Ersatz für StringReplace
Bei sakuras Code fehlt das Highlighting
und dann könnte man bitte mal bei seinem Code die AnsiString durch String ersetzen.
Der Code ist für
Unicode geeignet, aber so ist er nur
Ansi und ab D2009 ist das verwendete POS
Unicode.
(AnsiString + Uniode-Pos = ständige Stringumkodierungen)
Die nachfolgenden 3 Beiträge (#2 bis #4) sind auch hinfällig, da die verlinkten Seiten alle nicht mehr existieren.
Wenn man schon dabei ist, dann könnte man diesen Beitrag eventuell gleich noch mit Folgendem verschmelzen:
Code-Library -> Object-Pascal / Delphi-Language ->
Mehrere Strings auf einmal ersetzen
Soooo, aber man wird es nicht glauben, da ich die nun fehlenden Beiträge nicht so lassen kann ...
hier noch ein paar neue Versionen.
Diese sind zwar weitestgehend optimiert, aber der Übersichtlichkeit wegen wurde auf PChar's jetzt erstmal absichtlich verzichtet.
(es sollte dennoch recht flott sein)
Hab diese Funktionen jetzt nur mal schnell neu geschrieben und, soweit meine paar Tests es zeigten, sollten sie problemlos funktionieren.
Mit
Ansi und
Unicode dürften sie klarkommen und sind somit für alle Delphiversionen geeignet.
(solange ein
PosEx/
PosEx vorhanden ist)
bei der Array-Version:
- die Arrays können beliebig groß sein
- sind weniger NewPattern als OldPattern vorhanden, dann werden die "fehlenden" durch '' ersetzt
- ist genau ein NewPattern vorhanden, dann werden alle OldPattern durch das eine NewPattern ersetzt
-
[] und
[rfIgnoreCase] ersetzen nur DAS erste Vorkommen, egal was gefunden wird
-
[rfReplaceFirstOfAll] und
[rfReplaceFirstOfAll, rfIgnoreCase] ersetzen nur JEWEILS das erste Vorkommen aller Suchworte
-
[rfReplaceAll] und
[rfReplaceAll, rfIgnoreCase] ersetzt ALLE Vorkommen
Delphi-Quellcode:
Function StringReplace(Const S, OldPattern, NewPattern: String;
Flags: TReplaceFlags = []): String; Overload;
Function StringReplace(Const S: String; Const OldPattern, NewPattern: Array of String;
Flags: TReplaceFlags = []): String; Overload;
Als Arrays kann man statische oder dynamische String-Arrays oder die Werte direkt übergeben.
Delphi-Quellcode:
Const X: Array[1..6] of String = ('ae', 'oe', 'ue', 'Ae', 'Oe', 'Ue');
S := StringReplace(S, ['ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü'], X, [rfReplaceAll]);
Falls wer auf die Idee kommt "Wozu das Array? Ich nehm die Funktion einfach doppelt.
"
Ein Vorteil der gemeinsamen Ersetzung:
'Old1' => '<New1 Old2>'
'Old2' => '<New2 Old1>'
Delphi-Quellcode:
dummy := 'Text Old1 Old2 old1 old2 Old1 Old2 old1 old2 Text';
ergebnis := StringReplace(dummy, ['Old1', 'Old2'], ['<New1 Old2>', '<New2 Old1>'], []);
Memo1.Lines.Add(dummy);
Memo1.Lines.Add(ergebnis);
dummy := 'Text old1 old2 Old1 Old2 old1 old2 Old1 Old2 Text';
ergebnis := SysUtils.StringReplace(dummy, 'Old1', '<New1 Old2>', []);
ergebnis := SysUtils.StringReplace(ergebnis, 'Old2', '<New2 Old1>', []);
Memo1.Lines.Add(ergebnis);
Code:
Text old1 old2 [color=#ff0000]Old1[/color] [color=#0000ff]Old2[/color] old1 old2 Old1 Old2 Text
Text old1 old2 [color=#ff0000]<New1 Old2>[/color] [color=#0000ff]<New2 Old1>[/color] old1 old2 Old1 Old2 Text
Text old1 old2 [color=#ff0000]<New1 [/color][color=#ff00ff]<New2 Old1>[/color][color=#ff0000][b]>[/b][/color] [color=#0000ff]Old2[/color] old1 old2 Old1 Old2 Text
[edit]
kleiner Fehler im Header ... Kommentar nicht abgeschlossen und fast ganze Datei als Kommentar angesehn aka es wurde gemekert, daß kein Code gefunden wurde
[edit]
entsprechend Post #8 wurde noch ein neues Flag eingefügt
[edit=Matze]Anhänge aktualisiert.[/edit]