Page 2 sur 2

Publié : ven. 15/mai/2009 11:20
par Backup
excuse ma naïveté, mais pourquoi ne pas avoir utilisé

Position = FindString(Chaine$, ChaineCherchee$, PositionDepart)
et
String$ = ReplaceString(Chaine$, ChaineCherchee$, ChaineRemplacee$ [, Mode [, PositionDepart]])
???

Publié : ven. 15/mai/2009 12:41
par Backup
j'ai fait une petite procedure recursive :)

regarde la :
http://www.purebasic.fr/french/viewtopi ... 7859#97859

Publié : ven. 15/mai/2009 17:56
par cederavic
Ben.. ça marche avec les regex :

Code : Tout sélectionner

Text$ = "(A) : Test_Procedure20(coucou) (B) : Test_Procedure20 (coucou) (C) : Test_Procedure20"+Chr(13)+Chr(10)+"(coucou) (D) : Test_Procedure20      (coucou) (E) : Test_Procedure20   "+Chr(13)+Chr(10)+Chr(13)+Chr(10)+Chr(13)+Chr(10)+"(coucou)"
Text$ + "(A') : Test_Procedure201(coucou) (B') : Test_Procedure202 (coucou) (C) : Test_Procedure20"+Chr(13)+Chr(10)+"(coucou) (D') : Test_Procedure203      (coucou) (E') : Test_Procedure204   "+Chr(13)+Chr(10)+Chr(13)+Chr(10)+Chr(13)+Chr(10)+"(coucou)"
If CreateRegularExpression(0, "_Procedure20 {0,}?["+Chr(13)+Chr(10)+"]{0,}?\(") 
  Debug Text$
  Debug ReplaceRegularExpression(0, Text$, "_xxx(") 
EndIf
Biensur c'est specifique à la syntax d'une fonction nom_de_la_fonction[plusieur espaces ou non](
Mais le resultat est là...

Publié : ven. 15/mai/2009 18:03
par lionel_om
Dobro a écrit :excuse ma naïveté, mais pourquoi ne pas avoir utilisé

Position = FindString(Chaine$, ChaineCherchee$, PositionDepart)
et
String$ = ReplaceString(Chaine$, ChaineCherchee$, ChaineRemplacee$ [, Mode [, PositionDepart]])
???
En fait c'est conditionné par le caractère après le motif à chercher. Donc un simple ReplaceString ne marchera pas car il risque de remplacer trop d'occurrences.

Voilà un code qui marche:

Code : Tout sélectionner

Procedure.s SpecialReplaceString(Text$, FindMe$, ReplaceBy$)
  Protected index.l = 1, *char.c
  Protected lFindMe.l = Len(FindMe$), lReplBy.l = Len(ReplaceBy$)
  index = FindString(Text$, FindMe$, index)
  While index
    *char = PeekC(@Text$ + lFindMe + index - 1)
    If *char < '0' Or *char > '9'
      Text$ = Left(Text$,index-1) + ReplaceBy$ + Right(Text$, 1+Len(Text$)-(index+lFindMe))
      Debug Text$
      index + lReplBy + 1
    Else
      index + lFindMe + 1
    EndIf
    index = FindString(Text$, FindMe$, index)
  Wend
  ProcedureReturn Text$
EndProcedure

Text$ = "aa Test_Procedure20(coucou) bb Test_Procedure205 (coucou) cc Test_Procedure20 (coucou) cc Test_Procedure20"+Chr(13)+Chr(10)+"(coucou)"
SpecialReplaceString(Text$, "_Procedure20", "_xxx")
Je l'ai fait très vite fait. Il peut y avoir des effets de bords...

/Lio

Publié : ven. 15/mai/2009 18:07
par lionel_om
cederavic a écrit :Ben.. ça marche avec les regex :
...
Biensur c'est specifique à la syntax d'une fonction nom_de_la_fonction[plusieur espaces ou non](
Mais le resultat est là...
Le problème c'est que tu ne peux pas remplacer par "_xxx(" car il n'y a pas forcément cette parenthèse...
Progi1984 a écrit :
lionel_om a écrit :Tu as quoi alors ? Un espace ou un retour à la ligne ?
J'ai quoi derrière : _Procedure20 : tout sauf des chiffres...

Publié : ven. 15/mai/2009 18:21
par Backup
lionel_om a écrit : Voilà un code qui marche

:lol: j'avais deja fait une reponse dans ce genre :
j'ai pas testé ta version , mais il est probabble qu'elle soit plus rapide :)

Publié : ven. 15/mai/2009 18:58
par Progi1984
Dobro a écrit :excuse ma naïveté, mais pourquoi ne pas avoir utilisé

Position = FindString(Chaine$, ChaineCherchee$, PositionDepart)
et
String$ = ReplaceString(Chaine$, ChaineCherchee$, ChaineRemplacee$ [, Mode [, PositionDepart]])
???
Pas de problème...
FindString => parceque je voulais me faciliter la vie avec les regex :lol:.
RepaceString => à cause du problème de remplacement de 205 en xx5.

Je vais voir lequel va être le plus rapide entre Dobro & lionel_om.
Mais j'aime bien celui de lionel_om car cela correspond plus à mon problème.

Merci à vous tous...

Publié : ven. 15/mai/2009 19:22
par Backup
.........

Publié : ven. 15/mai/2009 23:42
par cederavic
Le problème c'est que tu ne peux pas remplacer par "_xxx(" car il n'y a pas forcément cette parenthèse...
C'est bien pour des appels de fonctions non?
De toute façon il faut bien un character pour delimiter la fin d'un "mot"...

Publié : sam. 16/mai/2009 7:44
par Progi1984
@Dobro: Toujours rapide et valide en réponse !

@cederavic: Ce code est pour parser de l'ASM, donc pas obligé qu'il y ait une parenthèse derrière cet appel.