Remplacer chaine de caractère [Résolu]

Signaler
Messages postés
269
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
22 novembre 2010
-
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
-
Bonjour à tous,

Voilà je souhaiterais juste pouvoir supprimer plusieurs caractères à la suite.

Je vais chercher dans la base de registre une certaine adresse, par exemple, une clé qui va contenir ceci :

C:\Documents and Settings\All Users\Bureau, et j'aimerais pouvoir enlever le "\Bureau".

Je suis avec cette ligne de code :

for i:=1 to Length(St) do
if St[i]='\Bureau' then Delete(St,i,1);

Mais malheureusement je n'arrive pas à m'en servir correctement...
En effet j'ai beaucoup de mal avec ce genre de chaine...

Donc comment lui faire comprendre que je ne voudrais pas supprimer UN caractère mais plusieurs ?

6 réponses

Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
10
salut,

une chose avec:

for i:=1 to Length(St) do

if St[i]='\Bureau' then Delete(St,i,1);

tu auras une superbe erreur de compilation : Type incompatible

en effet tu compares un types char (St[i]) avec un string ('\Bureau')

Pour tester si la chaine St contient la chaine bureau il faut utiliser
la fonction Pos() qui renvoie la position de la sous chaine dans la
chaine et 0 si elle n'y ait pas-->

if pos('\Bureau',St)<>0 then delete(st,pos('\Bureau',st),length('\Bureau'));



@+

jlen
Messages postés
4199
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
28
function DeleteString(const S : String; const RemoveString : string) : string;
var
PResult : PChar;
PValue : PChar;
i,c,L : integer;
begin
result := '';
SetLength(result,length(S));

PResult := PChar(result);
PValue := PChar(S);

// on recherche la premiere occurence
i := posex(RemoveString,S,1);
// on place notre compteur a 1
c := 1;
// on calcul la longeur de la chaine a supprimer -1
L := Length(RemoveString)-1;

// si aucune occurence de RemoveString n'est pas trouvée
if i = 0 then begin
// on renvois la chaine S
result := s;
// on sort de la methode
exit;
end;

// tant qu'on est pas au bout de la chaine S
while PValue^ <> #0 do begin
// si la position dans la chaine est differente de la position de l'occurence
// de la chaine a enlever ou que la chaine RemoveString n'est pas trouvée
if (not InRange(c,i,i+L)) or (i = 0) then begin
// on copie les caracteres de S vers Result
PResult[0] := PValue[0];
// on incremente PResult
inc(PResult);
end;

// on incremenete PValue
inc(PValue);
// idem pour C
inc(C);

// si on a depassé l'interval de la derniere occurence de RemoveString
if C > (i+L) then
// on recherche une nouvelle occurence
i := posex(RemoveString,S,i+L);
end;
// enfin, on termine la chaine AZT du resultat
PResult[0] := #0;
end;

voila, pour ceux qui trouverais que cette methode contient beaucoup de code, je vous conseil de lire la suite :

StringReplace est bien mais elle est longue a executée.

Copy, Delete, requiere du code suplementaire et ne sont pas vraiment adapté car de trop nombreux appel finiront par rendre la methode longue a executée.

sur ma methode, on peu supprimer trés vite de longue chaine dans un texte trés gros.
avec un petit bench on obtient :

pour virer ABC d'une chaine de 250 Octets (contenant une repetition de "ABCABCABC-")

10 000 appels a cette methode 63..94ms

ce qui je pense est trés trés raisonnable car le meme test avec StringReplace donne

10 000 appels a StringReplace 1297..1330ms

soit plus de 1200 ms par rapport a ma methode ...

make your choice.

Salut,



Tu souhaites vider un répertoire de ses fichiers puis détruire ce dernier si j'ai compris ??
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
Pourquoi pas :



function DeleteBureau(St: String): String;

begin

Result := StringReplace(St, '\Bureau', '', [rfIgnoreCase]);

end;





Bonne prog'
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

voici une alternative à StringReplace
http://www.droopyeyes.com/default.asp?mode=ShowProduct&ID=4

ya aussi cxpos library qui doit être faite en asm je crois
bonsoir
comment je peux remplacer une sous chaines de caractère s2 dans s1 par une chaine de caractère par exp 'GAMMA'; merci d'avance
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10
tu utilise le Stringreplace de japy un peu plus haut
Result := StringReplace(St, s2, s1, [rfIgnoreCase]);