Einzelnen Beitrag anzeigen

blackfin
(Gast)

n/a Beiträge
 
#5

AW: Zeichenkette im RichEdit zählen

  Alt 27. Mai 2011, 15:15
Schau dir mal das MapReduce Verfahren an, wenn du in Texten nach der Anzahl / Häufigkeit von Wörtern suchen willst.
Auf der Seite einfach mal etwas nach unten Scrollen und die "Beispielhafte Berechnung" angucken.


Ansonsten kannst du auch die folgende Funktion verwenden, die die Position eines gesuchten strings in einem Text ermittelt.
Wenn ein Wort öfters vorkommt, einfach den Text ab der ersten Fundstelle + Wortlänge des gesuchten Wortes abschneiden und weitersuchen.

Delphi-Quellcode:
function ASMstrPos(SubStr: AnsiString; Str: AnsiString;): DWORD;
type
  StrRec = packed record
  allocSiz: Longint;
  refCnt: Longint;
 length: Longint;
end;

const
        skew = sizeof(StrRec);

  asm
           TEST EAX,EAX
           JE @@noWork
           TEST EDX,EDX
           JE @@stringEmpty
           PUSH ECX
           PUSH EBX
           PUSH ESI
           PUSH EDI
           MOV ESI,EAX
           MOV EDI,EDX
           MOV EBX,ECX
           MOV ECX,[EDI-skew].StrRec.length
           SUB ECX,EBX
           PUSH EDI
           ADD EDI,EBX
           MOV EDX,[ESI-skew].StrRec.length
           DEC EDX
           JS @@fail
           MOV AL,[ESI]
           INC ESI
           SUB ECX,EDX
           JLE @@fail

         @@loop:
           REPNE SCASB
           JNE @@fail
           MOV EBX,ECX
           PUSH ESI
           PUSH EDI
           MOV ECX,EDX
           REPE CMPSB
           POP EDI
           POP ESI
           JE @@found
           MOV ECX,EBX
           JMP @@loop

         @@fail:
           POP EDX
           XOR EAX,EAX
           JMP @@exit

         @@stringEmpty:
           XOR EAX,EAX
           JMP @@noWork

         @@found:
           POP EDX
           MOV EAX,EDI
           SUB EAX,EDX

         @@exit:
           POP EDI
           POP ESI
           POP EBX
           POP ECX

         @@noWork:
end;
Edit II: Reguläre Ausdrücke würden sich hier alternativ auch anbieten...

Geändert von blackfin (27. Mai 2011 um 15:47 Uhr)
  Mit Zitat antworten Zitat