Avatar billede futterama Nybegynder
23. september 2004 - 08:09 Der er 16 kommentarer og
1 løsning

Søge efter samme substring flere gange i en string

Hej dér,

Jeg har en richedit med en masse tekst, og der vil jeg gerne highlighte et bestemt ord gennem hele strengen. Jeg bruger:

richedit1.SelAttributes.Style := [fsBold]; og
richedit1.SelAttributes.Color := clRed;

til at highlighte. Oprindeligt ville jeg bruge Pos til at finde ordet, men er der mere end 1 ord i strengen der skal highlightes, så retunerer Pos altså kun for det første. Hvordan får jeg den til at springe det ord over den lige har fundet? Uden at slette ordet naturligvis ;-)

Håber der er nogen med en god ide til hvordan man lige kan gøre det.

På forhånd tak!
Avatar billede arne_v Ekspert
23. september 2004 - 08:10 #1
Anden gang søger du kun fra der hvor du fandt den første + længden af det du søger efter.
Avatar billede futterama Nybegynder
23. september 2004 - 08:11 #2
Og hvordan gør man det? Jeg tænkte netop på det samme, men hvordan får man Pos til at starte fra f.eks. position 56?
Avatar billede arne_v Ekspert
23. september 2004 - 08:17 #3
Problemet er løst mange gange før se f.eks.:

http://www.delphi3000.com/articles/article_1504.asp?SK=
Avatar billede snowball Novice
23. september 2004 - 08:20 #4
Find a substring in a string starting from any position in the string

http://www.swissdelphicenter.com/en/showcode.php?id=2125

Alternativt kan du evt. bruge PosN functionen fra http://www.swissdelphicenter.com/en/showcode.php?id=738 i en while lykke som løber teksten igennem og tæller 1 op hver gang den finder noget, og så lade den køre indtil den ikke finder flere ord der passer.
Avatar billede futterama Nybegynder
23. september 2004 - 08:40 #5
Det lyder UTROLIGT besværligt at lave om på den nuværende Pos funktion bare for at løse dette problem. Mht. PosN, så kan jeg ikke bruge eksemplet som det er, så skal man jo fortælle netop hvilken occurence man vil have fat i, det er da besværligt.

Jeg har selv fundet en løsning som jeg kan bruge. Jeg laver en kopi af den streng jeg skal søge i. Derefter søger jeg i kopien, og finder jeg en occurence af ordet, så erstatter jeg det bare med noget andet, f.eks. en stak mellemrum (selvfølgelig så mange som ordet indeholder af tegn). Så laver jeg det jeg skal med ordet (laver farven om) og søger videre i kopien. Smart :-)

Men tak for svarene alligevel ;-)
Avatar billede futterama Nybegynder
23. september 2004 - 08:41 #6
StrReplace('occurence', 'forekomst') - Ups, kunne ikke komme i tanke om det danske ord :-D
Avatar billede borrisholt Novice
23. september 2004 - 08:42 #7
Personligt ville jeg nok bare bruge PosEx som er en del af StrUtils.

Fra online hjælpen :

Unit

StrUtils

Category

string handling routines

Delphi syntax:

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;

C++ syntax:

extern PACKAGE int __fastcall PosEx(const AnsiString SubStr, const AnsiString S, unsigned Offset = 1);

Description

PosEx returns the index of SubStr in S, beginning the search at Offset. If Offset is 1 (default), PosEx is equivalent to Pos.

PosEx returns 0 if SubStr is not found, if Offset is greater than the length of S, or if Offset is less than 1.

Jens B
Avatar billede borrisholt Novice
23. september 2004 - 08:48 #8
Åbner du spørgsmålet igen ?

Jens B
Avatar billede futterama Nybegynder
23. september 2004 - 08:49 #9
Jeg skal lige se om det kan bruges, der står intet om PosEx i Delphi 6 Help, så jeg er lidt skeptisk før jeg ser det virker ;-)
Avatar billede borrisholt Novice
23. september 2004 - 08:51 #10
Ellers har du koden her :

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
var
  I,X: Integer;
  Len, LenSubStr: Integer;
begin
  if Offset = 1 then
    Result := Pos(SubStr, S)
  else
  begin
    I := Offset;
    LenSubStr := Length(SubStr);
    Len := Length(S) - LenSubStr + 1;
    while I <= Len do
    begin
      if S[I] = SubStr[1] then
      begin
        X := 1;
        while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
          Inc(X);
        if (X = LenSubStr) then
        begin
          Result := I;
          exit;
        end;
      end;
      Inc(I);
    end;
    Result := 0;
  end;
end;


Jens B
Avatar billede futterama Nybegynder
23. september 2004 - 08:54 #11
Jeg ikke fatte :-/
Avatar billede futterama Nybegynder
23. september 2004 - 08:55 #12
Er det en funktion indbygget i Delphi, eller er det en funktion som man selv skriver?
Avatar billede borrisholt Novice
23. september 2004 - 09:02 #13
Jeg ved med sikkeerhed er indbygget i Delphi 7 der ligger den i strutils. Hvis den ikke er indbygget i Delphi 6 har jeg lige givet dig koden til den.

Jens B
Avatar billede futterama Nybegynder
23. september 2004 - 09:34 #14
"Åbner du spørgsmålet igen ?" <-- ja hvis du fortæller mig hvordan, så skal du skam have dine 100 point :-)
Avatar billede snowball Novice
23. september 2004 - 10:13 #15
Du kan ikke tage dit eget svar tilbage og dermed åbne spørgsmålet på den måde. Du bliver nødt til at oprette et nyt spørgsmål.
Avatar billede futterama Nybegynder
23. september 2004 - 11:14 #16
Nu er jeg alligevel lidt i tvivl om borrisholt skal have point, for jeg brugte i sidste ende min egen metode da den anden blev for besværlig...
Avatar billede nop Nybegynder
24. september 2004 - 13:46 #17
Den her er kortere:

function inString(const subStr: string; const str: string; start: integer): integer;
//returnerer index på substr i str, men starter fra start i str.
//hvis ikke fundet, eller start er størrer end længden på str, returneres 0.
begin
    if start <= length(str) then begin
        result:=pos(subStr,copy(str,start,length(str)-start+1));
        if result<>0 then result:=result+start-1;
    end else
        result:=0;
end; //inString
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB