Entwickler-Ecke

Sonstiges (Delphi) - Doppelte Buchstaben filtern


muetzenjoe - Mi 28.07.10 23:35
Titel: Doppelte Buchstaben filtern
Ich habe Probleme mit einem alten Programm von mir und bin nun dabei mir eine Erweiterung dafür zu basteln.

Das alte Tool ist sehr umfangreich und ich habe den Src dazu leider nicht mehr, kann also den Fehler dadrin nicht mehr beheben!

Egal!

Es geht auf jeden Fall dadrum, dass ich einen Text erhalte der decodiert bzw. generiert wird aber nen Fehler hat und mit so ziemlich alle Buchstaben/Ziffern doppelt ausgiebt. Dafür nun die Erweiterung die den Text filtern soll.

Hier mal ein Beispiel Text den ich erhalte:
Zitat:
HHaalllloo,, iicchh bbiinn eeiinn BBeeiissppiieell TTeexxtt!!

Gibt es eine relativ einfach Möglichkeit diesen text nun zu zu filtern, dass er wieder ein normaler Text wird?

Ich könnte ja einfach in einer Schleife anhand von pos() und stringreplace() nach den doppelten Buchstaben suchen und sie ersetzten aber was mache ich mit den doppelten, die doppelt bleiben sollen? wie in HHaalllloo(Hallo)? Gibt es eine Befehl in der Art wie strip() oder so der dafür funktionieren würde? Ich denke mal nicht. Aber ich hoffe, dass mich hier jemand auf ne Idee bringen kann und/oder sogar nen Beispiel oder Schnipsel Code für mich hat!

Danke im Vorraus!


Teekeks - Mi 28.07.10 23:51

Sagt dir "crosspost" etwas?


jaenicke - Mi 28.07.10 23:54

Naja, nicht sonderlich schnelle aber einfache Lösung:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
i := 1;
while i < Length(MyText) do
begin
  if MyText[i] = MyText[Succ(i)] then
    Delete(MyText, i, 1);
  Inc(i);
end;
Habs nicht getestet, aber sollte passen.
// EDIT: Du hast Recht, war wohl etwas spät gestern. ;-)


Tastaro - Do 29.07.10 10:33

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Naja, nicht sonderlich schnelle aber einfache Lösung:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
i := 1;
while i < Pred(Length(MyText)) do
begin
  if MyText[i] = MyText[Succ(i)] then
    Delete(MyText, i, 1);
  Inc(i);
end;
Habs nicht getestet, aber sollte passen.

Sieht gut aus, aber

Delphi-Quelltext
1:
i < length(MyText)                    

sollte besser sein.

Nebenbei: Ist pred und succ cooler als - 1 und + 1? Ich persönlich finde es deutlich schwerer zu lesen.

Beste Grüße


muetzenjoe - Do 29.07.10 23:28

Danke erst einmal. Ich versuche es mal. Habe da noch nen anderen Tip bekommen. Ich werde das jetzt gleich mal alles testen und gebe dann Meldung was am besten funktioniert!

Big ThX


Horst_H - Fr 30.07.10 11:26

Hallo,

Buchstaben scheinen ja sehr interessant zu sein..
Eine Variante ohne delete.


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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
program unbenannt;

{$IFDEF FPC}
  {$MODE DELPHI} 
{$ENDIF}

procedure DoppelteKuerzen(var s: string);
// entfernt alle doppelten Buchstaben und kuerzt den String

var
  i , j,k : integer;
begin
  writeln('vorher : ',s);
  IF length(s) < 2 then 
    exit;

  i := 1;
  j := 1;
  k := length(s);// Nur einmal abfragen
  
  while i < k do
    begin
    //Buchstaben innerhalb Zeichenkette kopieren
    s[j] := s[i];
    // Falls doppelt, dann dahinter weiter machen
    if s[i]=s[i+1then
      inc(i);
    inc(i);
    inc(j);
    end;
  writeln('nachher: ',s,'  ',i:3,j:3,k:3);
  
  // Falls letzter Buchstabe nicht doppelt, diesen kopieren
  IF i = k then
    begin
    s[j] := s[k];
    inc(j);// damit setlength anschliessend passt
    end
    
  setlength(s,j-1);
  writeln('Ergibt: ',s);
  writeln;
end;

var
  Test : string;
BEGIN
  Test := 'HHAALLLLOO,, DDIIEESS IISSTT EEIINN TESTT';
  DoppelteKuerzen(Test);

  Test := 'HAALLLLOO DDIIEESS IISSTT EEIINN TEST';  
  DoppelteKuerzen(Test);
  Test := 'HAALLLLOO';  // 4 'L'
  DoppelteKuerzen(Test);
  Test := 'HAALLLOO';   //  3 'L'
  DoppelteKuerzen(Test);
  readln
END.


Gruß Horst