Doppelte Whitespace-Zeichen aus String entfernen
-
- 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
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
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
Re: Doppelte Whitespace-Zeichen aus String entfernen
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:
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;
Re: Doppelte Whitespace-Zeichen aus String entfernen
Code: Alles auswählen
uses
SynRegExpr;
s := ReplaceRegExpr('(\s+)', s, ' ', false);
-
- 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
Vielen dank, das hab ich gesuchtDiBo33 hat geschrieben:Code: Alles auswählen
uses SynRegExpr; s := ReplaceRegExpr('(\s+)', s, ' ', false);

@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

Re: Doppelte Whitespace-Zeichen aus String entfernen
Das ist schnell erweitert (siehe unten).Zandru hat geschrieben:aber das ist mir etwas viel aufwand, dafür dass es mit regex auch schön in einer Zeile geht
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;
-
- 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
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
-
- 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
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;
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
Re: Doppelte Whitespace-Zeichen aus String entfernen
Es geht nicht nur um Spaces, auch um Tabs und LineEndings.monta hat geschrieben:aber warum so umständlich und nicht gleich das fertige nehmen:
Vllt. kann RemovePadChars das (k.A. ist glaub's nicht dokumentiert).
-
- 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
Sorry, ich hatte nur im ersten Beitrag Leerzeichen gelesen...dann genügt DelSpace1 natürlich nicht.
Johannes