Autor |
Beitrag |
galagher
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 23.01.06 19:05
... 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 |
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?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: 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();.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 23.01.06 19:32
GTA-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.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: 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!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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'; p := Pos(sFunkVar,sSuchStr); sErg := Copy(sSuchStr,1,p-1); Delete(sSuchStr,1,p+Length(sFunkVar)); case sSuchStr[1] of 'a' : sErg := sErg+'attrib'+Copy(sSuchStr,2,MAXINT); 't' : sErg := sErg+'time'+Copy(sSuchStr,2,MAXINT); end; showmessage(sErg); end; |
Dürfte eleganter sein als dafür ein Edit-Feld zu mißbrauchen 
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: 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();. |
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 24.01.06 23:51
GTA-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!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|