![]() |
StringReplace und doppelte Leerzeichen
Hi...
Irgendwie ein absolut blödes Problem. ich möchte in einem String keine doppelten Leerzeichen mehr haben. Hierfür jetzt mal die Funktion StringReplace getestet. Was bei beliebigen Zeichen funktioniert bringt mich hier fast zum Wahnsinn
Delphi-Quellcode:
funktioniert nicht und
s := StringReplace(s, ' ', ' ', [rfReplaceAll,rfIgnoreCase]);
Delphi-Quellcode:
auch nicht und
s := StringReplace(s, #32#32, #32, [rfReplaceAll,rfIgnoreCase]);
Delphi-Quellcode:
bringt auch nicht den erwünschten Erfolg.
s := AnsiReplaceText(s, #32#32, #32);
Any hint? |
Re: StringReplace und doppelte Leerzeichen
Hi,
du könntest eventuell mit regulären Ausdrücken arbeiten. Dann z.B. so einen Ausdruck wie (\s){2,} (oder ggf. direkt über die Angabe des Charakter-Codes, da \s ggf. auch andere Zeichen matched, soweit ich weiss) der nach mindestens 2 Leerzeichen matched suchen und das ganze Ergebnis mit einem Leerzeichen ersetzen. mfG mirage228 |
Re: StringReplace und doppelte Leerzeichen
Zitat:
Da musst Du Dir selbst eine kleine Funktion schreiben. Z.B.:
Delphi-Quellcode:
...:cat:...
function RemoveDblSpaces(const InStr: string): string;
var LastIsSpace: Boolean; I, Cnt: Integer; Res: string; begin SetLength(Res, Length(InStr)); Cnt := 0; LastIsSpace := False; for I := 1 to Length(InStr) do begin if LastIsSpace and (InStr[I] = #32) then Continue; LastIsSpace := InStr[I] = #32; Inc(Cnt); Res[Cnt] := InStr[I]; end; SetLength(Res, Cnt); Result := Res; end; |
Re: StringReplace und doppelte Leerzeichen
Alternative Lösung:
Delphi-Quellcode:
oder
while Pos(' ', DeinString) > 0 do
Delete(DeinString, Pos(' ', DeinString), 1);
Delphi-Quellcode:
Kommen die doppelten Leerzeichen häufig in einem String vor, dann dürfte die zweite Variante schneller sein.
while Pos(' ', DeinString) > 0 do
DeinString := StringReplace(DeinString, ' ', ' ', [rfReplaceAll]); |
Re: StringReplace und doppelte Leerzeichen
Zitat:
...:cat:... |
Re: StringReplace und doppelte Leerzeichen
Zitat:
Käme auf einen Versuch an. Vielleicht hat Pichel ja Lust, die Varianten zu vergleichen? |
Re: StringReplace und doppelte Leerzeichen
Zitat:
Delphi-Quellcode:
Variante 1: ca. 42 ms
procedure TForm1.Button1Click(Sender: TObject);
const x: array[0..27] of string = ( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', #32, #32#32 ); TEST = 1000; var Start, Stop, Freq: Int64; I: Integer; Source, Work, Dest: string; begin Source := ''; for I := 0 to 5000 do Source := Source + x[Random(Length(x))]; QueryPerformanceFrequency(Freq); QueryPerformanceCounter(Start); for I := 1 to TEST do begin Work := Source; Dest := RemoveDblSpaces(Work); end; QueryPerformanceCounter(Stop); Label1.Caption := Format('%f ms', [(Stop - Start) / Freq * 1000]); QueryPerformanceCounter(Start); for I := 1 to TEST do begin Work := Source; while Pos(' ', Work) > 0 do Delete(Work, Pos(' ', Work), 1); Dest := Work; end; QueryPerformanceCounter(Stop); Label2.Caption := Format('%f ms', [(Stop - Start) / Freq * 1000]); end; Variante 2: ca. 1567 ms Vernichtendes Urteil gegen die while/Delete-Schleife ;) ...:cat:... |
Re: StringReplace und doppelte Leerzeichen
Zitat:
Delphi-Quellcode:
2.592sek
while Pos(' ', DeinString) > 0 do
Delete(DeinString, Pos(' ', DeinString), 1); und
Delphi-Quellcode:
1.573sek
while Pos(' ', DeinString) > 0 do
DeinString := StringReplace(DeinString, ' ', ' ', [rfReplaceAll]); und das ganze bei einer Stringlänge von 77000 Zeichen, nicht so "pralle" |
Re: StringReplace und doppelte Leerzeichen
Zitat:
...:cat:... |
Re: StringReplace und doppelte Leerzeichen
Ok, OK, Ich gebe auf. War schon klar, dass das schneller ist, aber so eklatant? Das, ich 'abe nischt erwartet. :wink:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 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