Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - mehrere Leerzeichen zu 1 Leerzeichen


michaelarban - Mo 26.07.10 10:50
Titel: mehrere Leerzeichen zu 1 Leerzeichen
Hallo,

gibt es es eine Deplhi-Funtkion mit der man mehrere Leerzeichen zu 1 Leerzeichen zusammenfassen kann;

Bsp:

Quelltext
1:
meineStringVariable := 'das   ist      ein Satz  mit            leerzeicen';                    


-->Ergebnis soll sein

Quelltext
1:
meineStringVariable := 'das ist ein Satz mit leerzeicen';                    


danke


Gausi - Mo 26.07.10 10:54

Wenn der Text nicht zu lang ist, und es auf Geschwindigkeit nicht ankommt, kann man das Quick&Dirty so machen

Delphi-Quelltext
1:
2:
while pos('  ', myString) > 0 do 
   myString := Stringreplace(myString, '  '' ', [rfReplaceAll]);


Bei den Parametern bitte vorher kontrollieren, ob die so richtig sortiert sind, sonst hat man eine Endlosschleife und/oder schreibt sich den Speicher komplett voll. ;-)

Ansonsten erkläre ich hiermit die Optimierungs-Spiele für eröffnet. :D


kalmi01 - Mo 26.07.10 11:21

Hi,

mein Favorit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
s:= myString;
t := '';
while Length(s) > Length(t) 
do begin 
     t := s;
     s := Stringreplace(s, '  '' ', [rfReplaceAll]);
   end;


Längenvergleich sollte schneller gehen als Stringsuche.


Nersgatt - Mo 26.07.10 11:38

Gefühlsmäßig dürfte das ständige Neuzuweisen nicht gerade performant sein. Ich bin zwar auf dem Gebiet nicht wirklich gut, weil ich selten Sachen mache, wo es so auf Geschwindigkeit ankommt. Aber ich stell mal meinen Vorschlag zur Diskussion:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
var s : String;
    sNeu : string;
    i, j : integer;
begin

  s := 'das   ist      ein Satz  mit            leerzeicen';
  setLength(sNeu, Length(s));
  j := 1;
  for I := 1 to length(s) do
  begin
    if s[i] = ' ' then
    begin
      if (i = 1or (s[i - 1] <> ' 'then
      begin
        sNeu[j] := s[i];
        inc(j);
      end;
    end
    else
    begin
      sNeu[j] := s[i];
      inc(j);
    end;
  end;
  setLength(sNeu, j - 1);
  ShowMessage(s + #13#10 + sNeu);


end;