procedure TForm1.Button1Click(Sender: TObject);
var
k,N:integer;
Chaine,SousChaine:string;
begin
N:=0;
Chaine:=('DHDDHTTY AZ DD DH ER DRFG T DHAZA ZYTDH');
SousChaine:=('DH');
for k := 1 to length(Chaine) do
begin
if SousChaine = Copy( Chaine,k,length(SousChaine)) then
inc(N);
end;
Showmessage(inttostr(N));
j'essaye de compter le nombre d'une sous chaine dans une chaine, dans Mon cas c'est
la sous-chaine(DH) dans la Chaine:=('DHDDHTTY AZ DD DH ER DRFG T DHAZA ZYTDH')
Mon code me retourne le nombre 5 ,c'est tout a fait normal.
le problème est comment faire pour ne compter que la sous chaine(DH)indepondante des autres sous-chaines (dans mon exemple ça sera 1 car il 1 seule DH indepondante )
si quelqu'un sait comment faire Merci de m'en faire part
Merci a tous
Si la sous chaine se trouvait au début ou a la fin de la chaine le compte sera tjr faux
donc Cette façon de faire avec des espaces ne résout pas le problème
a moins que nous combinons les 3 positions , mais moi je cherchais plus simple
La solution que j'ai trouvé est la suivante
procedure TForm1.Button1Click(Sender: TObject);
var
Nsc2,i:integer;
Chaine,Sc,liste:string;
TmpChaine:TStringlist;
begin
Nsc2:=0;
Chaine:=('DHDDHTTY AZ DD DHER DRFG T DH AZA ZYTDH');
TmpChaine:=TStringlist.Create;
liste := StringReplace(Chaine,' ',#13#10, [rfReplaceAll, rfIgnoreCase]);
TmpChaine.Text:=liste;
for i := 0 to TmpChaine.Count -1 do
if MatchStr('DH', [TmpChaine.Strings[i]])then
inc(Nsc2);
showmessage(inttostr(Nsc2));
TmpChaine.Free;
pour info la classe TStringList possède deux propriétés (Delimiter et DelimitedText) qui te permet directement de donner ta chaîne sans avoir besoin de passer par un string replace.
Si la sous chaine se trouvait au début ou a la fin de la chaine le compte sera tjr faux
donc Cette façon de faire avec des espaces ne résout pas le problème
a moins que nous combinons les 3 positions , mais moi je cherchais plus simple
La solution que j'ai trouvé est la suivante
procedure TForm1.Button1Click(Sender: TObject);
var
Nsc2,i:integer;
Chaine,Sc,liste:string;
TmpChaine:TStringlist;
begin
Nsc2:=0;
Chaine:=('DHDDHTTY AZ DD DHER DRFG T DH AZA ZYTDH');
TmpChaine:=TStringlist.Create;
liste := StringReplace(Chaine,' ',#13#10, [rfReplaceAll, rfIgnoreCase]);
TmpChaine.Text:=liste;
for i := 0 to TmpChaine.Count -1 do
if MatchStr('DH', [TmpChaine.Strings[i]])then
inc(Nsc2);
showmessage(inttostr(Nsc2));
TmpChaine.Free;
end;
Merci encore
et Bravo...
L'utilisation de MatchStr (AnsiMatchStr sous D7) est astucieuse.
Joli code !
En fait, je m'aperçois que l'utilisation de MatchStr est inutile : une comparaison directe entre 'DH' et TmpChaine.Strings[i]] est suffisante :
Ce qui est astucieux néanmoins est l'idée d'avoir remplacé les espaces vides par "#13#10" dans la chaîne pour créer facilement la StringList.
Je maintiens donc mon "Bravo" ! ;-)