Doppelte Whitespace-Zeichen aus String entfernen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Zandru
Beiträge: 15
Registriert: Fr 28. Aug 2009, 18:01
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.2.4)
CPU-Target: 32Bit

Doppelte Whitespace-Zeichen aus String entfernen

Beitrag von Zandru »

Ich scheitere gerade an einer eigentlich simplen Aufgabe:
Ich möchte mithilfe eines regulären Ausdrucks aus einem String sämtliche doppelten Whitespace-Zeichen entfernen, sodass zwischen den Worten immer nur ein Leerzeichen steht.
In PHP würde ich das folgendermaßen machen: $str = preg_replace('~\s+~', ' ', $str);
Im Grunde müsste sich das doch direkt auf Lazarus/Delphi übertragen lassen, nur finde ich ums Verrecken nirgends den entsprechenden Befehl dafür...

Viele Grüße, Zandru

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Doppelte Whitespace-Zeichen aus String entfernen

Beitrag von theo »

Es gibt die Unit regexpr. Damit kenne ich mich aber nicht gut aus.

Diese Funktion tut was du haben willst, und das auch noch recht schnell:

Code: Alles auswählen

Function Compress_string(s:String):String;
var
  i, j, l : Integer;
begin
  result:='';
  j:=0;
  i:=1;
  l:=Length(s);
  SetLength(result, Length(s));
  While i<l+1 do
  Begin
    if (s[i]=#32) and (I>1) and (s[i-1]<>#32) then
    Begin
      Inc(j);
      Result[j]:=s[i];
    end
    else if s[i]<>#32 then
    Begin
      Inc(j);
      Result[j]:=s[i];
    end;
    Inc(i);
  end;
  SetLength(result, j);
end;

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Doppelte Whitespace-Zeichen aus String entfernen

Beitrag von DiBo33 »

Code: Alles auswählen

uses
  SynRegExpr;
 
 
 
  s := ReplaceRegExpr('(\s+)', s, ' ', false);

Zandru
Beiträge: 15
Registriert: Fr 28. Aug 2009, 18:01
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.2.4)
CPU-Target: 32Bit

Re: Doppelte Whitespace-Zeichen aus String entfernen

Beitrag von Zandru »

DiBo33 hat geschrieben:

Code: Alles auswählen

uses
  SynRegExpr;
 
  s := ReplaceRegExpr('(\s+)', s, ' ', false);
Vielen dank, das hab ich gesucht :)

@theo: Soweit ich das überblicke entfernt deine Funktion nur doppelte Leerzeichen, oder? Ich möchte aber alle whitespace-zeichen raus haben (also auch tabs und zeilenumbrüche). Klar könnte man die Funktion entsprechend erweitern, aber das ist mir etwas viel aufwand, dafür dass es mit regex auch schön in einer Zeile geht ;)

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Doppelte Whitespace-Zeichen aus String entfernen

Beitrag von theo »

Zandru hat geschrieben:aber das ist mir etwas viel aufwand, dafür dass es mit regex auch schön in einer Zeile geht ;)
Das ist schnell erweitert (siehe unten).
Wenn Geschwindigkeit eine Rolle spielt:
Die Funktion Compress_string ist rund 10 x schneller als die RegEx.
Kannst du mit dem Code in Button1Click selber testen.

Code: Alles auswählen

uses LCLIntf;     
 
Function Compress_string(s:String):String;
var
  i, j, l : Integer;
begin
  result:='';
  j:=0;
  i:=1;
  l:=Length(s);
  SetLength(result, Length(s));
  While i<l+1 do
  Begin
    if (s[i]<#33) and (I>1) and (s[i-1]>#32) then
    Begin
      Inc(j);
      Result[j]:=' ';
    end
    else if s[i]>#32 then
    Begin
      Inc(j);
      Result[j]:=s[i];
    end;
    Inc(i);
  end;
  SetLength(result, j);
end; 
 
Procedure TForm1.Button1Click(Sender: TObject);
Const C = 'a    '+#9+' b  '+LineEnding+' sadf j flk    sdfj sdfjas d asdf jldsja as';  
  Max = 100000;
Var Res: String;
Var Tick, i: Cardinal;
Begin
  Tick := GetTickCount;
  For i:=0 To Max Do
    Res := Compress_string(C);
  Writeln(GetTickCount-Tick);
  Memo1.text := Res;
 
  Tick := GetTickCount;
  For i:=0 To Max Do
    Res := ReplaceRegExpr('(\s+)', C, ' ', false);
  Writeln(GetTickCount-Tick);
  Memo2.text := Res;
End;

Zandru
Beiträge: 15
Registriert: Fr 28. Aug 2009, 18:01
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.2.4)
CPU-Target: 32Bit

Re: Doppelte Whitespace-Zeichen aus String entfernen

Beitrag von Zandru »

hm, ok die Geschwindigkeit ist natürlich ein Argument. In meinem aktuellen Fall spielt die keine große Rolle aber ich merks mir für die zukunft

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Doppelte Whitespace-Zeichen aus String entfernen

Beitrag von monta »

Also RegEx sind zwar vielleicht schön, aber warum so umständlich und nicht gleich das fertige nehmen:

http://lazarus-ccr.sourceforge.net/docs ... pace1.html" onclick="window.open(this.href);return false;

Code: Alles auswählen

DelSpace1 returns a copy of S with all sequences of spaces reduced to 1 space
Johannes

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Doppelte Whitespace-Zeichen aus String entfernen

Beitrag von theo »

monta hat geschrieben:aber warum so umständlich und nicht gleich das fertige nehmen:
Es geht nicht nur um Spaces, auch um Tabs und LineEndings.
Vllt. kann RemovePadChars das (k.A. ist glaub's nicht dokumentiert).

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Doppelte Whitespace-Zeichen aus String entfernen

Beitrag von monta »

Sorry, ich hatte nur im ersten Beitrag Leerzeichen gelesen...dann genügt DelSpace1 natürlich nicht.
Johannes

Antworten