Autor Beitrag
Blamaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: So 25.05.08 17:07 
Hi,

ich habe eine Sting in dem zwischen wörtern ' und + stehen. Wie kann ich nun alle ' und + aus einem String löschen lassen ?
die Zeichen befinden sich nicht immer an den selben Stellen. Ein löschen über Delete(String,x,x) fällt also raus.

Auch habe ich schon versucht mit POS('+', string) versucht die Position des + zeichen zu ermitteln, doch das macht auch probleme das ja sowohl + als auch ' im Delphi syntax vorkommen.

mfg Blamaster
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 25.05.08 17:11 
Moin!

Suche in: Delphi-Forum, Delphi-Library STRINGREPLACE

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
huuuuuh
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: So 25.05.08 17:12 
versuch StringReplace(string,'+','')
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 25.05.08 17:54 
Hallo,

ausblenden Delphi-Quelltext
1:
Text := StringReplace(StringReplace(Text, '+''', [rfReplaceAll]), '''''', [rfReplaceAll]);					

Aber vielleicht wäre es sinnvoller, eine while-if-Abfrage zu machen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
i := 1;                        // Laufvariable initialisieren
while i <= Length(S) do        // Solange Variable noch in der String-Länge ist
  if S[i] in ['+'''''then  // Wenn das Zeichen in der Menge enthalten ist,
    S := Delete(S, i, 1)       // Zeichen löschen und Position beibehalten (enthält jetzt das nächste Zeichen)
  else                         // sonst
    i := i + 1;                // Vairiable erhöhen

Grüße,
Yogu
Blamaster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: So 25.05.08 18:53 
Jau so funktioniert das super.

Thx :)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 25.05.08 23:01 
Moin!

user profile iconYogu hat folgendes geschrieben:
Aber vielleicht wäre es sinnvoller, eine while-if-Abfrage zu machen
Nein, das Delete() ist ungefähr genau so "schlecht" wie StringReplace() oder viele Stringverkettungen. :?

Wenn schon, dann mit einer Kopie und Abschneiden: :idea:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function Clean(const S: String): String;
  var
    i, p: Integer;
begin
  Result := S;
  p := 0;
  for i := 1 to Length(S) do
    if NOT (S[i] in ['+',#39]) then begin
      Inc(p);
      Result[p] := S[i];
    end;
  SetLength(Result,p);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := Clean(Edit1.Text);
end;
Hier wird nur einmal Speicher für den String angefordert und dann ggfs. auf die nötige Länge gekürzt, wärend Delete() und auch StringReplace() u.U. mehrfach den String umkopieren.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
wazup
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 101

Windows XP
Delphi 2009
BeitragVerfasst: Mo 26.05.08 01:41 
Ich hätte es so gemacht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function Clean(const S: string; List: array of Char): string;
var
  TEMP, CharList: string;
  I: Integer;
begin
  Result := '';
  CharList:= PChar(@List);
  TEMP := S;

  if TEMP <> '' then
    for I := 1 to Length(TEMP) do
      if Pos(TEMP[I], CharList) = 0 then
        Result := Result + TEMP[I];
end;

[...]

Caption := Clean('hallo', ['l']); // "hao"
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 26.05.08 09:32 
Moin!

user profile iconwazup hat folgendes geschrieben:
Ich hätte es so gemacht:
ausblenden Delphi-Quelltext
1:
2:
3:
//...
Result := Result + TEMP[I];
//...
Dieser Ansatz ist bei langen Strings absolut tödlich. :shock: Deshalb: genau eine Kopie anlegen und ggfs. absägen! :idea: ;) (btw: mein Ansatz ist sogar inline-fähig)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.