Sous-chaine indépendante des autres Sous-chaines

Résolu
Nadirbachire Messages postés 5 Date d'inscription vendredi 19 août 2016 Statut Membre Dernière intervention 25 août 2016 - 19 août 2016 à 18:36
Nadirbachire Messages postés 5 Date d'inscription vendredi 19 août 2016 Statut Membre Dernière intervention 25 août 2016 - 25 août 2016 à 19:20
Salut

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

2 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
19 août 2016 à 20:15
bonjour,

tout simplement:
SousChaine:=(' DH '); 

0
Nadirbachire Messages postés 5 Date d'inscription vendredi 19 août 2016 Statut Membre Dernière intervention 25 août 2016
20 août 2016 à 03:00
Merci a toi Cirec

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
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17 > Nadirbachire Messages postés 5 Date d'inscription vendredi 19 août 2016 Statut Membre Dernière intervention 25 août 2016
20 août 2016 à 14:28
Salut,

et Bravo...
L'utilisation de MatchStr (AnsiMatchStr sous D7) est astucieuse.
Joli code !
0
Nadirbachire Messages postés 5 Date d'inscription vendredi 19 août 2016 Statut Membre Dernière intervention 25 août 2016 > korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019
20 août 2016 à 16:22
Merci Korgis
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17 > Nadirbachire Messages postés 5 Date d'inscription vendredi 19 août 2016 Statut Membre Dernière intervention 25 août 2016
21 août 2016 à 17:02
Salut Nadirbachire,

En fait, je m'aperçois que l'utilisation de MatchStr est inutile : une comparaison directe entre 'DH' et TmpChaine.Strings[i]] est suffisante :

  for i := 0 to TmpChaine.Count - 1 do
      if TmpChaine.Strings[i] = 'DH' then
        Inc(Nsc2);

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" ! ;-)
0
Nadirbachire Messages postés 5 Date d'inscription vendredi 19 août 2016 Statut Membre Dernière intervention 25 août 2016
25 août 2016 à 19:20
Salut
quelqu'un d'autre a trouvé mieux

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.

code


TmpChaine:=TStringlist.Create;
TmpChaine.Delimiter:=' ';
TmpChaine.DelimitedText:=liste;
0
Rejoignez-nous