//"Test wie geht es dir so" hallo "Tach"

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

//"Test wie geht es dir so" hallo "Tach"

Beitrag von pluto »

Hallo,
ich habe ein Problem mit folgendem string:
"Test wie geht es dir so" hallo "Tach"

den würde ich gerne so pasen
"Test wie geht es dir so"
hallo
"Tach"

und zwar ab dem Leerzeichen so das ich einmal alles was vor dem erste Leerzeichen bekomme und einmal die anderen Leerzeichen aber die Leerzeichen inerhabl von "" soll ausgelassen werden beispiel:
GetToken('"Test wie geht es dir so" hallo " Tach"',1,' ');
soll
"Test wie geht es dir so" hallo "
zurückgeben und wenn wenn ich als Index nicht 1 eingebe sondern 2 möchte ich hallo haben und soweiter.... ich hoffe ihr versteht was ich meine !
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Jepp, entweder addieren mit "+" oder die dazugehörige Funktion aufrufen, ich komm nur gerade nicht auf den Namen.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

so ich habe es anscheiend noch geschafft:

Code: Alles auswählen

function GetTokenExt(str:String; septChar1,septChar2:Char; TokenNr:Integer):String;
var
  x,x1,x2,index,t,l:Integer;
  str1:String;
begin
  l:=Length(str);
  index:=0;  t:=0; x1:=0; x2:=0;
  for x:=1 to l do begin
    if (str[x] = SeptChar2) and (index <> 2) then begin
      index:=2;
    end
    else begin
      if (index = 2) and (str[x] = SeptChar2) then begin
        index:=0;
      end;
    end;
 
    if (x =l ) or (str[x] = SeptChar1) and (index = 0) then begin
      inc(t);
      if t = tokennr then begin
        if x = l then
          str1:=copy(str,x1+1,(x-x1)+1)
        else
          str1:=copy(str,x1+1,x-x1);
 
        break;
      end;
      x1:=x;
    end;
  end;
  result:=str1;
end;
 
//"Hallo, wie geht es dir" hallo "Test 1 tsss" Haus
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  edit3.text:=GetTokenExt(Edit1.Text,' ','"',StrToInt(Edit2.Text));
end;

evlt. kann das ja mal jemand optimieren !
Es erfüllt seinen zweck !
MFG
Michael Springwald

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Willst du eine KI schreiben, mit der sich der Benutzer unterhalten kann?

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

wie kommst du den darauf ?
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Na wahrscheinlich, weil du gewisse Informationen aus Sätzen filtrieren willst, welche Computer eher selten von sich geben ;)

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Das sieht nach Volltextsuche aus, das kann man mit Pascal-Mitteln prima machen. Pascal hat eine intelligente Stringverarbeitung (jedfalls besser als c++). Man könnte mit:

Code: Alles auswählen

function ComputeAnswer%u28AResStr, ASeperator%u3a string%u29%u3a integer;
var
  s, part%u3a string;
  spos%u3a integer;
begin
   while %u28length%u28AResStr%u29 > 0%u29 do begin
      spos%u3a= pos%u28ARestStr, ASeperator%u29;
      if %u28spos > 0%u29 then begin
        // jetzt irgendwas mit spos machen
        part%u3a= copy%u28ARestStr, 1, spos%u29;
        delete%u28AResStr, 1, spos%u29; // zeichen löschen wegen while
        // a b hier part testen und was anderes machen
        if %u28partid%u28part, AResStr%u29 > 0%u29 then begin
            // hier die Antwort erzeugen
           Result%u3a= ProduceAnswer%u28part%u29;
        end;
     end;
  end;
end;


Ein Frage- und Antwort-Spiel bauen. Das ist aber eine sehr komplexe Angelegenheit. Man erinnere sich an Herrn Bool. Dieser wollte einfach mathematisch genau die Übersetzung von Sprachen erzeugen (Universal-Translator). Das hat er mitnichten geschafft, dafür hat er aber die Boolsche Algebra um 1800 (George Boole (1815-1864)):

http://www.nano.physik.uni-muenchen.de/ ... k11t0.html

oder:

http://de.wikipedia.org/wiki/George_Boole

entwickelt, die in weiten Bereichen noch heute Grundlage für digitale Schaltungen und Computer-Programme ist (siehe Datentyp = boolean, daher der Name).
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

lustig ! ihr habt meine Frage falsch verstanden !
mir ging es nur um folgendes:
ich habe ein String z.b. so einen String:
"Hallo, dies ist ein Test" wie geht "es dir denn heute?"

mir ging es jetzt nicht um den Text allgemein sondern darum wenn ich alles haben wollte was vor dem erste leerzeichen ist.
also ich wollte nicht "Hallo," haben sondern alles was zwischen den "" steht das sollte er als eins ansehen und nicht alles viele Leerzeichen !

und genau das macht die funktion die ich oben vorgestellt habe !
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

aslso wenn du es kürzer haben willst, wieso nicht zweimal Pos, um den Text zwischen den ""zu erhalten?

ungefähr so:

Code: Alles auswählen

Copy(Pos(string, '"'), Pos(string, '" '))


eventuell eben dann die Stellen für " in nem Array oder so erstmal speichern, mit Leerzeichen im string ersetzen und erstmal alle Stellen merken und dann komplett schneiden.

Code: Alles auswählen

//Stellen ermitteln:
i := 0
while Pos(string, '"') > 0 do
begin
  Stellen[i] := Pos(string, '"');
  string[i] := ' ';
  inc(i);
end;
 
AnzahlStellen := i;
i := 0;
 
//Test, ob Anzahl " Gerade, wenn nicht, schließt Stringende automatisch
if AnzahlStellen mod 2 <> 0 then
  Stellen[AnzahlStellen + 1] := length(string); //da weiß ich nie, ob man noch -1 rechnen muss
 
//schneiden:
while i < AnzahlStellen do
begin
  Strings.Add(Copy(string, i, i + 1));
  i := i + 2;
end;


Abgesehen müsstest du eventuell noch abfangen, was bei einer ungeraden Anzahl von " passiert, so das das letzte nicht geschlossen wird. Da dann ja ein zugriff auf die Stelle i + 1 ins leere läuft.

Jetzt mal grob hingeschrieben, sollte aber so ungefähr laufen.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

vielen dank für den Tip....

also nochmal:
wenn ich bei ParamStr 1 angebe bekomme ich ja die erste stelle nicht war ?
wenn ich jetzt aber ein Dateinamen mit Leerzeichen angebe bekomme ich ja nicht den ganzen Dateinamen richtig ?

Wenn ich denn Dateinamen jetzt aber in "" setzte bekomme ich mit ParamStr(1) den Kompleten Dateinamen egal wie viele Leerzeichen drinen sind, richtig ?

also wie gesagt meine Funktion von oben Funktniert prima !
ich weiß nur nicht ob es noch schneller gehen könnte :?
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Was ist ParamStr 1 :?:

Du willst aus nem String den Teilstring erhalten, welcher zwischen " steht, seh ich das richtig?

Genau das macht mein Code zumindest nach meiner Auffassung doch, nur das der noch erweitert ist und beliebig viele Stellen, welche mit " eingeschlossen sind, extrahiert. Und ich denk mal, er dürfte schneller sein.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Paramstr(1) meine ich !

vielen dank... dann werde ich ihn mal bei gelegenheit ausprobieren
MFG
Michael Springwald

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

Code aus strings rausschneiden geht auch sehr gut mit der Funktion midstr.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Danke, die Funktion midstr. kenne ich noch garnicht
MFG
Michael Springwald

Antworten