Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Bestimmtes Wort im String ersetzen, aber...


galagher - Mo 23.01.06 19:05
Titel: Bestimmtes Wort im String ersetzen, aber...
... weder das erste gefundene noch alle gefundenen!

Hallo!
Ich wende mich mal wieder an euch! Folgendes Problem:
Ich habe einen String, in dem ich ein bestimmtes Wort ersetzen will. StringReplace ist hier erstmal das Richtige. Nur soll nicht das erste oder alle Worte, sondern nur ein Wort, das mittendrin sein kann, ersetzt werden. Mein Programm ist ein Befehlsinterpreter, mit dem man unter anderem sogen. Aliase erstellen kann - selbstdefinierte Befehlsworte für vorhandene Befehle. In folgendem Beispiel ist "a" das Alias für den Befehl "attrib", _@alias ist eine Funktionsvariable in meinem Programm und der Befehl - also "attrib" - soll angezeigt werden:

Delphi-Quelltext
1:
2:
3:
 echo Das ist der Befehl: _@alias a
 //erwartet wird als Ausgabe: Das ist der Befehl: attrib
 //ich erhalte aber: Dattribsist der Befehl:  a

Es soll 1. _@attrib völlig entfernt werden und 2. das a nach "_@attrib" durch den ermittelten Befehl ersetzt werden. Auch, wenn vor dem Wort "_@attrib" kein a vorkommt, klappt es nicht. Kein anderes Zeichen soll verändert werden, Gross-/Kleinschreibung soll erhalten bleiben.

Ach ja: Es kann sein, dass alle Worte bis auf echo in Anführungszeichen stehen:

Delphi-Quelltext
1:
echo "Das" "ist" "der" "Befehl:" "_@alias" "@Alt x"                    

Ich muss also ein Wort entfernen und das auf dieses folgende Wort ersetzen. Wie mache ich das?


GTA-Place - Mo 23.01.06 19:16

Ich hab das jetzt 5 mal durchgelesen und weiß immer noch net genau welches Wort du haben willst o_O.

Aber versuch es mal mit Explode(); oder Pos(); und Copy();.


galagher - Mo 23.01.06 19:32

user profile iconGTA-Place hat folgendes geschrieben:
Ich hab das jetzt 5 mal durchgelesen und weiß immer noch net genau welches Wort du haben willst o_O.

Aber versuch es mal mit Explode(); oder Pos(); und Copy();.


Ich möchte _@attrib völlig entfernen das a nach "_@attrib" durch den ermittelten Befehl ersetzen. Aber nur dieses, wobei das aber nicht immer nur ein einzelner Buchstabe sein muss. Ok, lassen wir das mit den Anführungszeichen erstmal weg. Es geht also darum, das Wort nach dem Wort, in dem _@ vorkommt, zu ersetzen und das Wort, in dem _@ vorkommt, zu entfernen.

Mit StringReplace kommt man da nicht weit.


galagher - Mo 23.01.06 22:06

Mittlerweile habe ich mir etwas aus einem Memo mit SelStart, SelLength und SelText zusammengestoppelt, das funktioniert. Ich werde das nun auf ein Edit übertragen, das ich zur Laufzeit eigens für diesen Zweck erzeuge. Vielleicht geht es aber auch eleganter!


Lannes - Mo 23.01.06 23:56

Hallo,

wenn ich Dein Vorhaben richtig verstanden habe,
dann versuch es mal damit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var sSuchStr, sFunkVar, sErg : String;
    p : Integer;
begin
  sSuchStr := 'echo Das ist der Befehl: _@alias a und der Text geht noch weiter';
  sFunkVar := '_@alias';
  //Suchen nach '_@alias ' und bis da bearbeiten
  p := Pos(sFunkVar,sSuchStr);
  sErg := Copy(sSuchStr,1,p-1);//bis alias sichern
  //abschneiden einschließlich '_@alias ' zum weiterverarbeiten
  Delete(sSuchStr,1,p+Length(sFunkVar));
  //wenn Alias nur ein Zeichen, dann so interpretieren
  case sSuchStr[1of //auf erstes zeichen zugreifen
   'a' : sErg := sErg+'attrib'+Copy(sSuchStr,2,MAXINT);
   't' : sErg := sErg+'time'+Copy(sSuchStr,2,MAXINT);
   //...
  end;
  //else, lass Dir was anderes einfallen {:-)}
  showmessage(sErg);
end;


Dürfte eleganter sein als dafür ein Edit-Feld zu mißbrauchen :wink:


GTA-Place - Di 24.01.06 18:04

Hast du den gesamten Beitrag von mir oder nur die obere Hälfte gelesen?

GTA-Place hat folgendes geschrieben:
Aber versuch es mal mit Explode(); oder Pos(); und Copy();.


galagher - Di 24.01.06 23:51

user profile iconGTA-Place hat folgendes geschrieben:
Hast du den gesamten Beitrag von mir oder nur die obere Hälfte gelesen?

Explode kennt mein Delphi6 nicht, mit Pos allein komme ich nicht weiter und Copy - naja, ich hab damit noch nie (ehrlich!) gearbeitet. Das Problem ist, es können praktisch alle Worte ident sein, aber nur das, das auf jenes mit _@ folgt, soll ersetzt werden.

Den Code von Lannes werde ich mir aber noch anschauen!