[gelöst] Doppelte Zeichen in einem STRING finden

31. Januar 2010 19:06

Hallo Leute,

ich versuche doppelte Zeichen in einem STRING zu finden und dann eins zu entfernen. Beispiel möchte ich aus 'MAPPE' 'MAPE' machen.

Ich habe es im Moment so umgesetzt:

Code:
iDummy; := 0;

sSuchString := 'MAPPE';

REPEAT
   iDummy := STRPOS(sSuchString, 'PP');
   IF iDummy > 0 THEN
      sSuchString := DELSTR(sSuchString,iDummy,1);
UNTIL iDummy = 0;



Kennt eine von euch einen besseren Weg?

Ganz lieben Dank schon mal.

Gruß
Marc
Zuletzt geändert von Schureck am 3. Februar 2010 09:57, insgesamt 2-mal geändert.

Re: Doppelte Zeichen in einem STRING finden

31. Januar 2010 22:32

Schureck hat geschrieben:ich versuche doppelte Zeichen in einem STRING zu finden und dann eins zu entfernen. Beispiel möchte ich aus 'MAPPE' 'MAPE' machen.

Soll deine Funktion Doppelbuchstaben (egal welche, auch Vokale, egal ob Groß- oder Kleinschreibung) automatisch ausfindig machen und dabei immer den zweiten Buchstaben löschen?

Re: Doppelte Zeichen in einem STRING finden

1. Februar 2010 18:49

Hallo Natalie,

das ist ja cool mit dem [code].. :-)

Also ich habe den STRING schon in Großbuchstaben umgewandelt und JA ich will alle doppelten suchen und in einfache Buchstaben umwandeln.

Wie aus TASSENMAPPE wird TASENMAPE.

Gruß

Marc

Re: Doppelte Zeichen in einem STRING finden

1. Februar 2010 19:22

Dann schubs ich dich mal (hoffentlich) in die richtige Richtung:
Du kannst folgendermaßen ein Wort (wir gehen jetzt also schon von der Großschreibung aus) Buchstabe für Buchstabe von vorn nach hinten durchlaufen:

Code:
FOR i := 1 TO STRLEN(DeinWort) DO BEGIN
  // Beispiele:
  // Wenn i = 1, dann DeinWort[i] := 1. Buchstabe von DeinWort
  // Wenn i = 2, dann DeinWort[i] := 2. Buchstabe von DeinWort
  // usw.
END;


Naja, und wenn du gerade auf einer bestimmten Position (i) bist, kannst du doch schauen, ob die nächste Position nicht auch den gleichen Buchstaben enthält. Wenn ja: diesen löschen und i um 1 aufaddieren ...

Re: Doppelte Zeichen in einem STRING finden

1. Februar 2010 19:39

so gehts:
Code:
TextString := 'TASSENMAPPE';

FOR I := 1 TO STRLEN(TextString) DO BEGIN
  IF COPYSTR(TextString,I,1)=COPYSTR(TextString,I+1,1) THEN
    TextString := COPYSTR(TextString,1,I)+COPYSTR(TextString,I+2);
END;

MESSAGE(TextString);

Das berücksichtigt allerding nicht das mehr als zweifache Vorkommen eines Buchstabens z.B.: 'TASSENMAPPPE', aber das sollte auch hinzukriegen sein...

Re: Doppelte Zeichen in einem STRING finden

1. Februar 2010 20:03

Wenn du schon die Lösung vorwegnehmen möchtest, dann schreibs wenigstens nicht so umständlich ;-)
Code:
...
FOR I := 1 TO STRLEN(TextString) DO BEGIN
  IF TextString[I] = TextString[I+1] THEN
    TextString := COPYSTR(TextString,1,I)+COPYSTR(TextString,I+2);
END;
...

Was noch fehlt, ist eine Prüfung, ob i+1 nicht außerhalb von STRLEN ist - oder man lässt I nur bis STRLEN - 1 laufen.

Re: Doppelte Zeichen in einem STRING finden

3. Februar 2010 09:56

Hallo zusammen,

das ist auch ein cooler Ansatz. HAbe ihn auch schon umgesetzt.

Ich habe es mit der FOR Schleife nicht hinbekommen. Wenn ich ein Zeichen lösche ändert sich ja die STRLEN.

Und bei mir schien es so als ob NAV den Wert einmal beim Starten der Schleife berechnet und wenn sich zur Laufzeit der Wert ändert bekommt die Schleife das nicht mit.

Der Code ist nun 4 mal so schnell.

Danke.

Trotzdem noch mal die Frage: gibt es einen Befehl mit dem ich 2 Zeichen aus einnem STRING mit einem ersetzen kann?

Mit CONVERTSTR kann ich ja immer nur die gleich Anzahl ersetzen.

Liebe Grüße

Marc

Re: Doppelte Zeichen in einem STRING finden

3. Februar 2010 09:59

Schureck hat geschrieben:Ich habe es mit der FOR Schleife nicht hinbekommen. Wenn ich ein Zeichen lösche ändert sich ja die STRLEN.

Und bei mir schien es so als ob NAV den Wert einmal beim Starten der Schleife berechnet und wenn sich zur Laufzeit der Wert ändert bekommt die Schleife das nicht mit.

Hm stimmt. Du könntest probieren, vor FOR den Anfangswert von STRLEN in eine integer-Variable zu schreiben und diese neue Variable in FOR zu verwenden.
Wenn du innerhalb von FOR ein Zeichen löschst, musst du die Variable selbst um 1 reduzieren.

Re: [gelöst] Doppelte Zeichen in einem STRING finden

3. Februar 2010 10:09

Natalie hat geschrieben:Wenn du innerhalb von FOR ein Zeichen löschst, musst du die Variable selbst um 1 reduzieren.

Ist doch gar nicht nötig? Das läuft zumindest in keinen Fehler ...

Re: [gelöst] Doppelte Zeichen in einem STRING finden

3. Februar 2010 10:18

McClane hat geschrieben:
Natalie hat geschrieben:Wenn du innerhalb von FOR ein Zeichen löschst, musst du die Variable selbst um 1 reduzieren.

Ist doch gar nicht nötig? Das läuft zumindest in keinen Fehler ...

Stimmt, hatte ich vergessen: Wenn der Quelltext in die FOR-Zeile zurückspringt, ist STRLEN natürlich eine Neuberechnung.
Habe mich durch die vorherigen Aussagen verleiten lassen.

Re: [gelöst] Doppelte Zeichen in einem STRING finden

3. Februar 2010 10:26

Da hattest du schon recht, aber das ist nur unschön. In einem Text mit strlen=10 kann man Text[20] problemlos bekommen, insofern die Länge des Feldes dafür groß genug ist.