Page 1 sur 1

remplacement de replaceString

Publié : sam. 12/mai/2007 19:24
par minirop
bonjour,
j'aimerais savoir s'il existait une fonction comme replaceString mais qui fait un seul remplacement ? parce que dans mon interprète, les expressions sont parser comme des chaines donc j'utilises remplaceStrin mais comme replaceString remplace TOUTES les occurences, çà merde.
exemple :

Code : Tout sélectionner

5*5/10*2 => 25/10*2 => 2.5*2 => 5 ; OK!
5*5/5*5 => 25/25 => 1 ; pas OK !
voilà si quelqu'un à une astuce
merci
++

Publié : sam. 12/mai/2007 19:37
par Dr. Dri
c'est peut-être plus compliqué à mettre en oeuvre mais tu peux te faire une fonction qui ferait en gros ceci :

-trouver la première occurence de la chaine à remplacer
-récupérer ce qu'il y a avant
-récupérer ce qu'il y a après
-retourner "avant" + remplacement + "après"

Dri

Publié : sam. 12/mai/2007 19:40
par minirop
pas bête j'y avait pas pensé :s
merci

Publié : sam. 12/mai/2007 19:46
par Dr. Dri
allez je suis gentil voila un code tout fait

Code : Tout sélectionner

Procedure$ ReplaceFirst(String$, StringToFind$, StringToReplace$)
  
  Index  = FindString(String$, StringToFind$, 1)
  Length = Len(String$) - Len(StringToFind$) - Index
  
  If Index
    String$ = Left(String$, Index-1) + StringToReplace$ + Right(String$, Length+1)
  EndIf
  
  ProcedureReturn String$
EndProcedure

Debug ReplaceFirst("5*5/5*5", "5*5", "25")
Dri

Publié : sam. 12/mai/2007 19:52
par minirop
je l'ai fais dans mon coin (j'aime pas les codes tout prêts), voici ce que çà donne :

Code : Tout sélectionner

Procedure.s myReplaceString(string.s,match.s,rempl.s)
	pos.l = FindString(string,match,1)
	endpos.l = pos + Len(match)
	first.s = Left(string,pos-1)
	second.s = Right(string,Len(string)-endpos+1)
	ProcedureReturn first + rempl + second
EndProcedure

Publié : sam. 12/mai/2007 19:55
par Gratteur
J'ai ça qui traine d'un vieux programme :

Code : Tout sélectionner

Procedure.s ReplaceFirstString(Chaine.s, ChaineCherchee.s, ChaineRemplacee.s, Position=1)
  Protected p = FindString(Chaine, ChaineCherchee, Position)-1
  If p >= 0
    ProcedureReturn Left(Chaine, p)+ChaineRemplacee+Right(Chaine, Len(Chaine)-Len(ChaineCherchee)-p)
  EndIf
  ProcedureReturn Chaine.s
EndProcedure

txt.s = "Salut gaga, ça va ?"
Debug txt
Debug ReplaceString(txt, "ga", "gi")
Debug ReplaceFirstString(txt, "ga", "gi")

Publié : mar. 15/mai/2007 21:41
par Flype
dans un tout autre genre - histoire de changer des Left(), Right(), Len()...

Code : Tout sélectionner

Procedure.s Replace(String.s, StringToFind.s, StringToReplace.s)
  Protected *a.Character = @String, *b.Character = @StringToFind
  While *a\c 
    While *a\c = *b\c 
      *a + SizeOf(Character) 
      *b + SizeOf(Character) 
      If Not *b\c 
        ProcedureReturn PeekS(@String, i) + StringToReplace + PeekS(*a) 
      EndIf 
    Wend 
    *a + SizeOf(Character) 
    i + 1 
  Wend 
  ProcedureReturn String 
EndProcedure 

Publié : mer. 16/mai/2007 6:53
par brossden
Bonjour Flype tu pourrais expliquer un peu ?

Publié : mer. 16/mai/2007 7:10
par brossden
Ok j'ai pigé en fin de compte mais c'est aimer se compliquer la vie quand même ! lol

Publié : mer. 16/mai/2007 8:15
par Flype
oui mais c'est un poil plus rapide :wink: car il n'y a pas de fonction puurebasic sur les chaines (left, right, len, ...) dans l'algo.