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

Nadirbachire 5 Messages postés vendredi 19 août 2016Date d'inscription 25 août 2016 Dernière intervention - 19 août 2016 à 18:36 - Dernière réponse : Nadirbachire 5 Messages postés vendredi 19 août 2016Date d'inscription 25 août 2016 Dernière intervention
- 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 

Votre réponse

6 réponses

Cirec 4221 Messages postés vendredi 23 juillet 2004Date d'inscriptionModérateurStatut 11 mai 2018 Dernière intervention - 19 août 2016 à 20:15
0
Utile
bonjour,

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

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

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.