Autor Beitrag
Yooda
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68



BeitragVerfasst: Mo 07.11.05 18:25 
Hallo,

ich suche eine Möglichkeit die Anzahl übereinstimmender Häufungen von bestimmten Buchstaben(Min. 3 Zeichen) in einem Text zu finden.

Beispiel:

ABCDE EFGHI JKLMN ZDHDH FHFJDS ABCEJ KJABC JDGFA
BCKFH JABCE JDHFZ QHJDF ABDCDE FHAIF DASEA HJFAB
CDEFG HIJKL MNOPQ RSTUV usw..

In dem obigen Beispiel gibt es ABC 5x in dem gesamten Text. Daraufhin benötige ich
den Abstand zwischen den ABC's.

Habt ihr eine Idee wie ich das Anstellen kann?

Ich hab es so probiert, aber das ist wahrscheinlich der größte schei*

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
 Memo1.Text := StringReplace(Memo1.Text, ' ', '', [rfReplaceAll, rfIgnoreCase]);

 t_lines :=   Memo1.Lines.Count;
 t_letters := Memo1.GetTextLen;

 Edit1.Text := inttostr(t_lines);
 Edit2.Text := inttostr(t_letters);

  position := 1;

  while position <= length(memo1.lines.text) do
  begin
    currentchar := copy(memo1.lines.text, position, 3);
    for i:=0 to t_lines do
     begin
      Edit3.Text  := inttostr(pos(currentchar, Memo1.Lines[i]));
      memo2.Lines.Add(Edit3.Text);
     end;

//    Memo2.Lines.add(currentchar);
    position := position+1;
  end;



Ich bräuchte folgende Ausgabe:

ABC 5 1,26,39 : Abstandszahl (Beispiel beim ersten: Abstand 26 zeichen)
CDE 3 2,.. usw.
DEF 1 usw...

Ich hoffe, dass ich es verständlich rüberbringen konnte.


Viele Grüße

David

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 08.11.05 10:12 
Also: Du willst alle Kombinationen aus drei Buchstaben in einem Text mit Anzahl und Position, hab ich das richtig verstanden?

Da frage ich mich nur, warum du die Leerzeichen entfernst, denn die gehoeren zur Position doch dazu...

Nun, jedenfalls hilft dir da die Funktion PosEx...

Ein Array of Boolean nimmt alle Zahlen von 1 bis Length(Memo1.Text)-2 auf. So weisst du sofort, ob die Dreierkombination an einer bestimmten Stelle schon erfasst wurde. Dann kannst du einfach alle Positionen durchgehen und, falls die Kombination noch nicht erfasst wurde, von da an alle noch nicht erfassten Positionen testen.
Dazu gehst du mit PosEx immer hinter die letzte Fundstelle und suchst das naechste Vorkommen.