Sous-chaine indépendante des autres Sous-chaines [Résolu]

Messages postés
5
Date d'inscription
vendredi 19 août 2016
Statut
Membre
Dernière intervention
25 août 2016
- - Dernière réponse : 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
Afficher la suite 

2 réponses

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
0
Merci
bonjour,

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

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

et Bravo...
L'utilisation de MatchStr (AnsiMatchStr sous D7) est astucieuse.
Joli code !
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
-
Merci Korgis
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15 > Nadirbachire
Messages postés
5
Date d'inscription
vendredi 19 août 2016
Statut
Membre
Dernière intervention
25 août 2016
-
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" ! ;-)
Commenter la réponse de Cirec
Messages postés
5
Date d'inscription
vendredi 19 août 2016
Statut
Membre
Dernière intervention
25 août 2016
0
Merci
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;
Commenter la réponse de Nadirbachire