Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   StringReplace und doppelte Zeichen (https://www.delphipraxis.net/105530-stringreplace-und-doppelte-zeichen.html)

Opa 23. Dez 2007 19:33


StringReplace und doppelte Zeichen
 
Nach dem ich erkennen musste das <StringReplace> nicht immer richtig funktioniert
StringReplace(S,#32#32,#32) kommt es zu Fehlern.
Hier mal eine Lösung: (Uppercase habe ich weggelassen, ich brauche das nicht für mein PRG)
Code:
function KillDoppelZeichenToZeichen(S:string;C:Char):string;
var
  I : integer;
begin
  if Length(S) < 2 then
  begin
    Result := S;//Zufrieden
   exit;
  end;
  Result := '';
  I := Length(S);
  repeat
    if (S[I] = C) and (I > 1) then
    begin
        while (S[I-1] = C) and (I > 1) do
        begin
          dec(I);
          if I < 2 then break; //Vertippt nicht 1 sonder I
        end;
     end;
    Result := S[I]+Result;
   dec(I);
  until I < 1;
end;
MFG

himitsu 23. Dez 2007 19:48

Re: StringReplace und doppelte Zeichen
 
Wie nicht richtig funktioniert?
was für Fehler?

und wie sollte deine Funktion da helfen, bzw. wie soll man die nutzen?


ja und wozu ist der leere Try-Except-Block?

if Length(S) < 2 then exit; : was pasiert wenn S nur 1 Zeichen lang ist?

[add]
was is'n dat für'n komischer Denglisch-Funktionsname?

[add2]
if 1 < 2 then break; : 1 ist immer kleiner als 2 (aber das sollte dir Delphi auch schon gesagt haben)

Opa 23. Dez 2007 20:10

Re: StringReplace und doppelte Zeichen
 
1: Der Name es viel mir nichts besseres ein. (Ist doch egal)
2: Der Try Except der kann weg (gestört hatte der aber nicht)
3 Wie die Helfen kann dann gib mal ein:
caption :=
_KillDoppelZeichenToZeichen(‚xxDasxlebenxxso schönxxxxseinxwennxesxnichtxxxxwelchexgebenxwürdex xxdiexxherummekelnxxmüssen.’,’x’);
Das Ding geht und fertig. Kannst den Mod sagen: Das Du es löschen möchtes und gut ist!

X = <Leer-Zeichen>
MFG :duck:

Matze 23. Dez 2007 20:28

Re: StringReplace und doppelte Zeichen
 
Hallo,

was funktioniert denn bei StringReplace nicht? Bei mir geht alles einwandfrei, zumindest konnte ich kein Fehlverhalten feststellen. ;)

Grüße

Opa 23. Dez 2007 21:43

Re: StringReplace und doppelte Zeichen
 
Ja wirklich? Dann versuch das mal mit (xxDasxxxxxLebenx ist schön)
Code:
var
  Flags  : TReplaceFlags;
  OK : boolean;
  S : string;
begin
  S:='xxDasxxxxxLebenx ist schön';{x = ggf. Leer-Zeichen}
  Flags := [rfReplaceAll, rfIgnoreCase];
//  S := StringReplace(S,'xx','x',Flags); // Erg = xDasxxxLebenx ist schön
    S:= KillDoppelZeichenToZeichen(S,'x'); //Erg = xDasxLebenx ist schön (so will ich das haben)
  Caption := S;
Mfg

grenzgaenger 23. Dez 2007 22:16

Re: StringReplace und doppelte Zeichen
 
und wo liegt das problem???

Delphi-Quellcode:
var
  Flags  : TReplaceFlags;
  OK : boolean;
  S : string;
begin
  S:='xxDasxxxxxLebenx ist schön';{x = ggf. Leer-Zeichen}
  Flags := [rfReplaceAll, rfIgnoreCase];
  S := StringReplace(S,'xx','x',Flags); // Erg = xDasxxxLebenx ist schön
//  xDasxxxLebenx ist sch÷n
   writeln(s);
   readln;
end.
das macht delphi doch optimal und genau richtig :-) . je zwei xx werden mit einem x ersetzt... also beispiel

xxDas --> xDas

und das kommt doch genau raus, oder brauch ich eine brille? :roll:

übrigens xxxxx = 5 x = 2x ersatz plus 1x übrig also xxx

himitsu 23. Dez 2007 22:22

Re: StringReplace und doppelte Zeichen
 
Dann hast du String Replace nicht verstanden, denn das ist genauso wie StringReplace geplant ist, also völlig richtig.

Recursionen gibt es nicht.

Delphi-Quellcode:
S := 'xxxxxxxxxx';
//    1122334455

S := StringReplace(S, 'xx', 'x', [rfReplaceAll]);

// S = 'xxxxx'
//      12345
weil rate mal was hier sonst passieren würde
Delphi-Quellcode:
S := 'xxx';
S := StringReplace(S, 'x', 'xx', [rfReplaceAll]);
das ergäbe bei Rekursion nicht 'xxxxxx' sondern einen unendlichlangen String aus x (also OutOfMemory oder wen unendlich Speicher vorhanden, dann würde dies Funkion nie ferig werden)


PS:
DoppelzeichenZuZeichen
EntferneDoppelZeichen
EntferneMehrfachZeichen
KillDupeChars
...

Dax 23. Dez 2007 22:24

Re: StringReplace und doppelte Zeichen
 
Ich glaube, Opa sucht eine Funktion, die der Regex r/x{2,}/x/g folgt...

Opa 23. Dez 2007 22:49

Re: StringReplace und doppelte Zeichen
 
Ich suche nicht ich schreibe es mir selber. :coder:

Was StringReplace macht ist mir (Jetzt) klar und auch wie er es macht.
Was ich brauchte, war eine >Einfache Funktion< Die alle doppelten Zeichen (die fortlaufend sind) löscht bis auf eines.

Das Problem war, dass ich in Dateinamen doppelte Leerzeichen (evtl. x Leerzeichen, fortlaufen) hatte. Ein Leerzeichen wollte ich aber erhalten. Und nachdem ich mir StringReplace angeschaut hatte, stellte ich fest dass, dieses nicht geht. Also hatte ich mir eine eigenen Funktion geschrieben. Und weil bald Weihnachten ist, dachte ich das auch andere diese Funktion gebrauchen können. Ich mach das nie wieder! Ich merke schon das dieses nicht erwünscht ist. Bin halt ein alter Mann und denke wirres Zeug. :spin2:

Sollte es in Delphi eine Funktion sein (die ich nicht kenne) die viele Zeichen durch aber mindestens 1 ersetzt/behält. Bitte mitteilen.

MFG

grenzgaenger 23. Dez 2007 23:42

Re: StringReplace und doppelte Zeichen
 
tja, aber für 'ne einfache funktion recht komplex geworden...

guck dir mal den folgenden code an ... etwas kompakter, macht das selbe, denke ist besser für weiterentwicklungen...

grüsse und noch schöne weihnachten

Delphi-Quellcode:
function ReplaceDChar(Quelle: string; aChar: char): string;
var
 i: integer;
begin
 result := '';
 for i := 1 to length(quelle) do
  if (length(result)=0) or (quelle[i]<>result[length(result)]) or (aChar<>result[length(result)]) then
   result := result + quelle[i];
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 Uhr.
Seite 1 von 5  1 23     Letzte »    

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