![]() |
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:
MFG
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; |
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) |
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: |
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 |
Re: StringReplace und doppelte Zeichen
Ja wirklich? Dann versuch das mal mit (xxDasxxxxxLebenx ist schön)
Code:
Mfg
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; |
Re: StringReplace und doppelte Zeichen
und wo liegt das problem???
Delphi-Quellcode:
das macht delphi doch optimal und genau richtig :-) . je zwei xx werden mit einem x ersetzt... also beispiel
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. 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 |
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:
weil rate mal was hier sonst passieren würde
S := 'xxxxxxxxxx';
// 1122334455 S := StringReplace(S, 'xx', 'x', [rfReplaceAll]); // S = 'xxxxx' // 12345
Delphi-Quellcode:
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)
S := 'xxx';
S := StringReplace(S, 'x', 'xx', [rfReplaceAll]); PS: DoppelzeichenZuZeichen EntferneDoppelZeichen EntferneMehrfachZeichen KillDupeChars ... |
Re: StringReplace und doppelte Zeichen
Ich glaube, Opa sucht eine Funktion, die der Regex r/x{2,}/x/g folgt...
|
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 |
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 16:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz