Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Aufeinander folgende Whitespaces entfernen, eins lassen (https://www.delphipraxis.net/42530-aufeinander-folgende-whitespaces-entfernen-eins-lassen.html)

Mois 20. Mär 2005 12:32


Aufeinander folgende Whitespaces entfernen, eins lassen
 
Hallo

Ich möchte einen Text der so aussieht:


Delphi-Quellcode:
"Hallo dies          ist ein test"
in folgenden umwandeln:

Delphi-Quellcode:
"Hallo dies ist ein test"
So das immer nur ein whitespace kommt nicht mehrere.
wie stele ich das an?

Airblader 20. Mär 2005 12:34

Re: Aufeinander folgende Whitespaces entfernen, eins lassen
 
Wenn du meinst aus

Delphi-Quellcode:
"Hallo dies ist ein Test"
das zu machen

Delphi-Quellcode:
"Hallo dies ist ein Test"
würde ich es so machen:
In einer Schleife gehst du alles Buchstaben durch.
ist der akt. Buchstaben ein Leerzeichen, checkst du, ob der nächste es auch ist.
Wenn ja, kannst du es entfernen.

air

alcaeus 20. Mär 2005 12:35

Re: Aufeinander folgende Whitespaces entfernen, eins lassen
 
Sollte so funktionieren:

Delphi-Quellcode:
while (Pos(' ', Str) > 0 do
  Str := StringReplace(Str, ' ', ' ', []);
Greetz
alcaeus

[edits]Source-Korrekturen[/edits]

SirThornberry 20. Mär 2005 12:38

Re: Aufeinander folgende Whitespaces entfernen, eins lassen
 
suche mit pos/PosEx einfach nach Leerzeischen und entferne alle leerzeischen die direkt dahinter folgen.

@alcaeus: Deine variante hat den Nachteil das kein leerzeischen bleibt falls eine gerade anzahl an leerzeischen hintereinander steht.
desweiteren ist die whileschleife nicht notwendig wenn du mit "rfReplaceAll" arbeitest.
desweiteren sollte der erste parameter von StringReplace der String (Str) sein und nicht " "

Mois 20. Mär 2005 12:40

Re: Aufeinander folgende Whitespaces entfernen, eins lassen
 
Danke es funktioniert.

alcaeus 20. Mär 2005 12:42

Re: Aufeinander folgende Whitespaces entfernen, eins lassen
 
Zitat:

Zitat von SirThornberry
@alcaeus: Deine variante hat den Nachteil das kein leerzeischen bleibt falls eine gerade anzahl an leerzeischen hintereinander steht.

:wall: Das rfReplaceAll muss raus, dann funktioniert es auch wie geplant.

Greetz
alcaeus

sakura 20. Mär 2005 12:47

Re: Aufeinander folgende Whitespaces entfernen, eins lassen
 
Zitat:

Zitat von Mois
Danke es funktioniert.

Wenn es um größere Text geht, dann dürfte obige Methode sehr langsam werden. Hier eine optimierte Lösung:
Delphi-Quellcode:
function RemoveUnwantedSpace(const Txt: AnsiString): AnsiString;
var
  I: Integer;
  Used: Integer;
  InCh: ^Char;
  LastWasSpace: Boolean;
  Res: AnsiString;
begin
  SetLength(Res, Length(Txt));
  if Length(Txt) > 0 then
  begin
    Used := 0;
    LastWasSpace := False;
    InCh := @Txt[1];
    for I := 1 to Length(Txt) do
    begin
      if InCh^ = #32 then
      begin
        if not LastWasSpace then
        begin
          Inc(Used);
          Res[Used] := InCh^;
          LastWasSpace := True;
        end;
      end
      else
      begin
        LastWasSpace := False;
        Inc(Used);
        Res[Used] := InCh^;
      end;
      Inc(InCh);
    end;
    SetLength(Res, Used);
  end;
  Result := Res;
end;
Aufruf wie folgend:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := RemoveUnwantedSpace(Edit1.Text);
end;
...:cat:...

stoxx 20. Mär 2005 13:24

Re: Aufeinander folgende Whitespaces entfernen, eins lassen
 
vollständigerweise noch meine Methode ;-)

Delphi-Quellcode:
function TrimInside( s : string) : string;
var i, i2 : integer;
begin
i := 0;
i2 := 0;
s := trim(s);
while i < length(s) do
begin

if (s[i] = ' ') and (s[i2] = ' ') then
 begin
   delete(s,i,1);
 end else
 begin
  inc(i);
  i2 := i-1;
 end;
end;
result := s;

end; // von TrimInside

SirThornberry 20. Mär 2005 13:31

Re: Aufeinander folgende Whitespaces entfernen, eins lassen
 
ich denk mal den source von sakura kann man auch noch optimiert in dem man keinen zweiten res-String verwendet sondern direkt im SourceString ändert, also den String als Var und nicht als Const übergeben.

Christian Seehase 20. Mär 2005 14:00

Re: Aufeinander folgende Whitespaces entfernen, eins lassen
 
Moin Sir Thornberry,

dann kannst Du allerdings keine Eigenschaften wie Edit1.Text direkt übergeben, müsstest diese also vorher in eine Variable übertragen, und anschliessend wieder zurück ;-)
Bleibt sich also gleich, nur wird das eigentliche Programm etwas umfangreicher.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 Uhr.

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